Без будь-якої інформації про побудову цих позитивних визначених реальних симетричних матриць, пропозиції, які слід зробити, є необхідними досить обмеженими.12×12
Я завантажив пакет Armadillo з Sourceforge і ознайомився з документацією. Спробуйте покращити продуктивність окремих обчислень та , де - матриця першої категорії всіх, встановивши, наприклад . У документації зазначається, що для матриць розміром до це значення за замовчуванням, тому за пропуском я припускаю, що цей варіант є типовим для випадку .det(Q)det(12I−Q−J)Jdet(Q,slow=false)
4×4slow=true
12×12
Що slow=true
імовірно робить часткове або повне поворотний в отриманні форми ешелонованої рядки, з яких визначник легко знайдений. Однак ви заздалегідь знаєте, що матриця є позитивно визначеною, тому повороти не потрібні для стабільності (принаймні, припущену для більшості ваших обчислень. Незрозуміло, чи пакет Armadillo кидає виняток, якщо оберти стають надмірно маленькими, але це має бути особливість розумною числовий лінійної алгебри пакет. EDIT: Я знайшов код Armadillo , який реалізує в заголовки , з допомогою шаблонів C ++ для істотної функціональності настройка. чи не здається , впливає , якQdet
include\armadillo_bits\auxlib_meat.hpp
slow=false
12×12детермінант буде зроблено, оскільки обчислення в цьому місці "перекидаються на стіну" до ЛАПАКА (або ATLAS), не вказуючи на те, що повороти не потрібно; див. det_lapack
та виклики у цьому файлі.
Іншим моментом було б дотримуватися їх рекомендації щодо створення пакету Armadillo, який посилається на швидкісні заміни для BLAS та LAPACK, якщо ви їх справді використовуєте; див. розд. 5 файлу Armadillo README.TXT для детальної інформації. [Використання спеціальної 64-розрядної версії BLAS або LAPACK також рекомендується для швидкості на сучасних 64-бітних машинах.]
Зведення рядків до ешелонової форми по суті є гауссовим усуненням і має арифметичну складність . Для обох матриць це означає, що це вдвічі більше, ніж робота, або . Ці операції цілком можуть бути «вузьким місцем» у вашій обробці, але мало сподівань, що без спеціальної структури в (або деяких відомих співвідношеннях між трильйоном тестових випадків, що дозволяють амортизувати), робота може бути зведена до .23n3+O(n2)43n3+O(n2)QO(n2)
Для порівняння, розширення на коефіцієнти загальної матриці включаєоперації множення (і приблизно стільки ж додавання / віднімання), тому для порівняння ( проти ) явно сприяє усуненню над коефіцієнтами.n×nn!n=1212!=47900160023n3=1152
Інший підхід, що вимагає роботи , буде зведення до тридіагональної форми з перетвореннями Householder, що також приводить у тридіагональну форму. Після цього обчислення і можуть бути виконані в операціях . [Ефект оновлення першого рангу у другому визначнику можна виразити як скалярний коефіцієнт, заданий розв’язуванням однієї тридіагональної системи.]43n3+O(n2)Q12I−Qdet(Q)det(12I−Q−J)O(n)−J
Реалізація такого незалежного обчислення може бути корисною як перевірка результатів успішних (або невдалих) викликів до det
функції Armadillo .
Особливий випадок: Як запропоновано коментарем Джернея, припустимо, що де як і раніше, є матрицею (ранг 1) усіх, а - a несинулярна (позитивна) діагональна матриця. Дійсно, для запропонованого застосування в теорії граф це були цілі матриці. Тоді явна формула для :Q=D−JJD=diag(d1,…,dn)det(Q)
det(Q)=(∏i=1ndi)(1−∑i=1nd−1i)
Ескіз його доказування дає можливість проілюструвати більш широку застосовність, тобто, коли має відомий детермінант і система швидко вирішується. Почнемо з розбивки:DDv=(1…1)T
det(D−J)=det(D)⋅det(I−D−1J)
Тепер знову ранг 1, а саме . Зауважимо, що другий визначник - це просто:D−1J(d−11…d−1n)T(1…1)
f(1)=det(I−D−1J)
де є характеристичним поліномом . Як матриця 1-го рангу, повинна мати (принаймні) коефіцієнтів для врахування її нульового простору. "Відсутнє" власне значення - , як видно з обчислень:f(x)D−1Jf(x)n−1x∑d−1i
D−1J(d−11…d−1n)T=(∑d−1i)(d−11…d−1n)T
Звідси випливає, що характеристичний многочлен , а такий, як показано вище для , .f(x)=xn−1(x−∑d−1i)f(1)det(I−D−1J)1−∑d−1i
Також зауважте, що якщо , то - діагональна матриця, визначником якої є просто добуток її діагональних записів.Q=D−J12I−Q−J=12I−D+J−J=12I−D