Без некоторой информации о построении этих положительно определенных вещественных симметричных матриц, предложения, которые необходимо сделать, по необходимости достаточно ограничены.12 × 12
Я скачал пакет Armadillo с Sourceforge и посмотрел документацию. Попробуйте улучшить производительность отдельно вычисления и йе ( 12 I - Q - J ) , где J является ранг одна матрица из всех из них, например , путем установки . В документации отмечается, что это значение по умолчанию для матриц размером до 4 × 4 , поэтому, по пропущению, я полагаю, что это вариант по умолчанию для случая 12 × 12 .дет ( Q )дет ( 12 я- Q - J)Jdet(Q,slow=false)
4 × 4slow=true
12 × 12
Что slow=true
предположительно делает частичное или полное поворотное в получении формы эшелонированной строки, из которых определитель легко найден. Однако вы заранее знаете, что матрица положительно определена, поэтому поворот не нужен для стабильности (по крайней мере, предположительно для большей части ваших вычислений. Неясно, выбрасывает ли пакет Armadillo исключение, если стержни становятся чрезмерно маленькими, но это должно быть особенность разумного пакета числовой линейной алгебры. РЕДАКТИРОВАТЬ: Я нашел код Armadillo, который реализует в заголовочном файле , используя шаблоны C ++ для существенной функциональности. Похоже, что настройка не влияет на 12 × 12Qdet
include\armadillo_bits\auxlib_meat.hpp
slow=false
12 × 12определитель будет выполнен, потому что вычисление «отбрасывается через стену» в LAPACK (или ATLAS) в этой точке без указания того, что поворот не требуется; увидеть det_lapack
и его вызовы в этом файле.
Другой момент - следовать их рекомендации по созданию пакета Armadillo, связанного с высокоскоростными заменами для BLAS и LAPACK, если вы действительно их используете; см. гл. 5 файла Armadillo README.TXT для деталей. [Использование выделенной 64-битной версии BLAS или LAPACK также рекомендуется для скорости на современных 64-битных машинах.]
Приведение строки к форме эшелона является по существу гауссовым исключением и имеет арифметическую сложность . Для обеих матриц это в два раза больше, или423N3+ O ( n2). Эти операции вполне могут быть «узким местом» в вашей обработке, но мало надежды на то, что без специальной структуры вQ(или каких-либо известных связей между триллионом тестовых случаев, допускающих амортизацию) работа может быть уменьшена доO(n2).43N3+ O ( n2)QO ( n2)
Для сравнения, разложение по кофакторам общей матрицы включает n ! операции умножения (и примерно столько же сложений / вычитаний), поэтому при n = 12 сравнение ( 12 ! = 479001600 против 2n × nн !n = 1212 ! = 479001600) явно способствует исключению по сравнению с кофакторами.23N3= 1152
Другой подход, требующий Работа 3 n3+O(n2)сводитQк трехдиагональной форме с преобразованиями Хаусхолдера, что также переводит12I-Qв трехдиагональную форму. ВычислениеDET(Q)иDET(12I-Q-J)затем может быть сделано вO(п)операций. [Эффект обновления первого ранга-J43N3+ O ( n2)Q12 я- Qдет ( Q )дет ( 12 я- Q - J)O ( n )- J во втором определителе можно выразить как скалярный фактор, заданный решением одной трехугольной системы.]
Реализация такого независимого вычисления может быть полезна как проверка результатов успешных (или неудачных) вызовов det
функции Armadillo .
Особый случай: Как следует из Комментария Джерней, предположим, что где J, как и прежде, является матрицей (ранг 1) всех единиц, а D = diag ( d 1 , … , d n ) является неособой (положительной) ) диагональная матрица. Действительно, для предложенного приложения в теории графов это будут целочисленные матрицы. Тогда явная формула для det ( Q ) :Q = D - JJD = Diag ( д1, ... , dN)дет ( Q )
det ( Q ) = ( ∏я = 1Ndя) ( 1 - ∑я = 1Nd- 1я)
Схема его доказательства дает возможность проиллюстрировать более широкую применимость, т. Е. Всякий раз, когда имеет известный определитель и система D v = ( 1 ... 1 ) T быстро решается. Начните с факторинга:DD v = ( 1 … 1 )T
дет ( Д - Ж) = det ( D ) ⋅ det ( I)- D- 1J)
Теперь снова имеет ранг 1, а именно ( d - 1 1 ... d - 1 n ) T ( 1 ... 1 ) . Обратите внимание, что второй определитель просто:D- 1J( д- 11... d- 1N)T(1…1)
f(1)=det(I−D−1J)
где - характеристический многочлен D - 1 Дж . Как матрица ранга 1, f ( x ) должна иметь (как минимум) n - 1 множителей x для учета ее нулевого пространства. «Пропущенное» собственное значение равно ∑ d - 1 i , как видно из вычисления:f(x)D−1Jf(x)n−1x∑d−1i
D−1J(d−11…d−1n)T=(∑d−1i)(d−11…d−1n)T
Отсюда следует , что характеристический полином , и F ( 1 ) является , как показано выше для DET ( я - Д - 1 Дж ) , 1 - Σ d - 1 я .f(x)=xn−1(x−∑d−1i)f(1)det(I−D−1J)1−∑d−1i
Также отметим, что если , то 12 I - Q - J = 12 I - D + J - J = 12 I - D , диагональная матрица, определитель которой является просто произведением ее диагональных элементов.Q=D−J12I−Q−J=12I−D+J−J=12I−D