Проверка, имеют ли две матрицы 12x12 одинаковый определитель


11

Мне дают матрицу Q которая является симметричной, обратимой, положительно определенной и плотной. Мне нужно проверить, если det, где J является матрицей всех единиц.12×12Q

йе(Q)знак равнойе(12я-Q-J)(1)
J

В настоящее время я делаю это с библиотекой броненосца, но она оказывается слишком медленной. Дело в том, что мне нужно сделать это для триллиона матриц, и оказывается, что вычисление двух определителей является узким местом моей программы. Отсюда у меня два вопроса

  1. Есть ли какой-нибудь прием, который я мог бы использовать, чтобы вычислить определитель быстрее, учитывая, что я знаю их размер? Может быть, грязное расширение для матриц 12×12 которое могло бы работать в этом случае?

  2. Есть ли другой эффективный способ проверить равенство (1)

Редактировать. Чтобы ответить на комментарии. Мне нужно вычислить все связные не самодополняющие графы грамм порядка 13 , чтобы грамм и грамм¯ имели одинаковое количество остовных деревьев. Мотивация для этого может быть найдена в этом сообщении mathoverflow . Что касается машины, я запускаю ее на 8-ядерном 3.4GHh компьютере параллельно.

Редактировать. Мне удалось сократить ожидаемое время выполнения на 50%, создав программу на C для специального вычисления определителя матрицы . Предложения все еще приветствуются.12×12


6
Как медленно, слишком медленно? Сколько времени это займет на каком оборудовании? Являются ли триллионы этих независимыми, чтобы вы могли вычислить многие из этих определителей параллельно? Если да, то на какой машине ты сможешь работать? Что привело к этой проблеме? Вы уверены, что вам нужно вычислить детерминанты? Q
Билл Барт

3
Как часто (для какой доли случаев) детерминанты одинаковы / различны? Если они отличаются друг от друга в большинстве случаев, может быть более дешевый тест, чтобы определить, что они могут отличаться, и вы проверите, что они одинаковы, только если первый тест не пройден. И наоборот, если они большую часть времени одинаковы.
Вольфганг Бангерт

1
Как уже было сказано: не могли бы вы предоставить некоторые сведения о том, откуда появился ? Возможно, есть лучший подход, чем слепые вычисления детерминантов. Q
JM

4
Представление о том, что это условие должно быть проверено «для триллиона матриц», предполагает, 1) что априори как известно, имеет некоторую особую структуру (в противном случае ожидание того, что условие выполняется случайным образом, незначительно), и 2) что лучший подход может быть для характеристики всех матриц с этим свойством (с эффективно проверяемой формулировкой). QQQ
hardmath

1
@hardmath Да, - это целочисленная матрица, имеющая диагональные элементы в диапазоне от 1 до 12 и - 1 как недиагональные элементыQ1121
Jernej

Ответы:


8

Так как вы уже используете C ++ и ваши матрицы симметричная положительно определенная, я бы выполнить unpivoted факторизация Q , а также из 12 I - Q - J . Здесь я предполагаю, что 12 I - Q - J также является положительно определенным, в противном случае L D L T потребует поворота для численной устойчивости (также возможно, что, хотя оно не является положительно определенным, поворот не требуется, но вы должны попробуй).LDLTQ12я-Q-J12я-Q-JLDLT

Это быстрее, чем факторизация LU, а также быстрее, чем Cholesky, потому что избегают квадратных корней. Определитель - это просто произведение элементов диагональной матрицы. Код для выполнения факторизации ЛПНП настолько прост, что вы можете написать его менее чем в 50 строках C. На странице Википедии описан алгоритм, и у меня есть несколько простых шаблонных кодов, которые можно сделать здесь по Холецки . Вы можете значительно упростить это и изменить его, чтобы избежать квадратного корня для реализации факторизации L D L T.DLDLT

Поскольку вы также можете управлять форматом хранения, вы можете дополнительно оптимизировать подпрограмму, чтобы сохранить только половину матрицы и упаковать ее в линейный массив, чтобы максимизировать локальность памяти. Я также написал бы простые пользовательские подпрограммы для продукта точек и обновления ранга 1, поскольку размеры проблем настолько малы, что вы должны позволить компилятору встроить эти подпрограммы, чтобы уменьшить накладные расходы. Поскольку это цикл фиксированного размера, компилятор должен иметь возможность автоматически вставлять и развертывать объекты, когда это необходимо.

Я бы не пытался разыгрывать трюки, чтобы воспользоваться тем фактом, что содержит Q внутри выражения. Вполне вероятно, что при таких небольших размерах задач эти приемы оказываются медленнее, чем просто выполнение двух отдельных определителей. Конечно, единственный способ проверить эти претензии - это попробовать.12я-Q-JQ


1
Во-вторых, я рекомендую внедрить , то есть «холеский» без корней, поскольку у «Армадилло», похоже, нет возможности воспользоваться преимуществами положительной определенности / диагонального доминирования. LDLT
hardthth

5

Без некоторой информации о построении этих положительно определенных вещественных симметричных матриц, предложения, которые необходимо сделать, по необходимости достаточно ограничены.12×12

Я скачал пакет Armadillo с Sourceforge и посмотрел документацию. Попробуйте улучшить производительность отдельно вычисления и йе ( 12 I - Q - J ) , где J является ранг одна матрица из всех из них, например , путем установки . В документации отмечается, что это значение по умолчанию для матриц размером до 4 × 4 , поэтому, по пропущению, я полагаю, что это вариант по умолчанию для случая 12 × 12 .det(Q)det(12IQJ)Jdet(Q,slow=false)4×4slow=true12×12

Что slow=true предположительно делает частичное или полное поворотное в получении формы эшелонированной строки, из которых определитель легко найден. Однако вы заранее знаете, что матрица положительно определена, поэтому поворот не нужен для стабильности (по крайней мере, предположительно для большей части ваших вычислений. Неясно, выбрасывает ли пакет Armadillo исключение, если стержни становятся чрезмерно маленькими, но это должно быть особенность разумного пакета числовой линейной алгебры. РЕДАКТИРОВАТЬ: Я нашел код Armadillo, который реализует в заголовочном файле , используя шаблоны C ++ для существенной функциональности. Похоже, что настройка не влияет на 12 × 12Qdetinclude\armadillo_bits\auxlib_meat.hppslow=false12×12определитель будет выполнен, потому что вычисление «отбрасывается через стену» в LAPACK (или ATLAS) в этой точке без указания того, что поворот не требуется; увидеть det_lapackи его вызовы в этом файле.

Другой момент - следовать их рекомендации по созданию пакета Armadillo, связанного с высокоскоростными заменами для BLAS и LAPACK, если вы действительно их используете; см. гл. 5 файла Armadillo README.TXT для деталей. [Использование выделенной 64-битной версии BLAS или LAPACK также рекомендуется для скорости на современных 64-битных машинах.]

Приведение строки к форме эшелона является по существу гауссовым исключением и имеет арифметическую сложность . Для обеих матриц это в два раза больше, или423N3+О(N2). Эти операции вполне могут быть «узким местом» в вашей обработке, но мало надежды на то, что без специальной структуры вQ(или каких-либо известных связей между триллионом тестовых случаев, допускающих амортизацию) работа может быть уменьшена доO(n2).43N3+О(N2)QО(N2)

Для сравнения, разложение по кофакторам общей матрицы включает n ! операции умножения (и примерно столько же сложений / вычитаний), поэтому при n = 12 сравнение ( 12 ! = 479001600 против 2N×NN!Nзнак равно1212!знак равно479001600) явно способствует исключению по сравнению с кофакторами.23N3знак равно1152

Другой подход, требующий Работа 3 n3+O(n2)сводитQк трехдиагональной форме с преобразованиями Хаусхолдера, что также переводит12I-Qв трехдиагональную форму. ВычислениеDET(Q)иDET(12I-Q-J)затем может быть сделано вO(п)операций. [Эффект обновления первого ранга-J43N3+О(N2)Q12я-Qйе(Q)йе(12я-Q-J)О(N)-J во втором определителе можно выразить как скалярный фактор, заданный решением одной трехугольной системы.]

Реализация такого независимого вычисления может быть полезна как проверка результатов успешных (или неудачных) вызовов detфункции Armadillo .

Особый случай: Как следует из Комментария Джерней, предположим, что где J, как и прежде, является матрицей (ранг 1) всех единиц, а D = diag ( d 1 , , d n ) является неособой (положительной) ) диагональная матрица. Действительно, для предложенного приложения в теории графов это будут целочисленные матрицы. Тогда явная формула для det ( Q ) :Qзнак равноD-JJDзнак равнодиаг(d1,...,dN)йе(Q)

йе(Q)знак равно(Πязнак равно1Ndя)(1-Σязнак равно1Ndя-1)

Схема его доказательства дает возможность проиллюстрировать более широкую применимость, т. Е. Всякий раз, когда имеет известный определитель и система D v = ( 1 ... 1 ) T быстро решается. Начните с факторинга:DDvзнак равно(1...1)T

йе(D-J)знак равнойе(D)йе(я-D-1J)

Теперь снова имеет ранг 1, а именно ( d - 1 1 ... d - 1 n ) T ( 1 ... 1 ) . Обратите внимание, что второй определитель просто:D-1J(d1-1...dN-1)T(1...1)

е(1)знак равнойе(я-D-1J)

где - характеристический многочлен D - 1 Дж . Как матрица ранга 1, f ( x ) должна иметь (как минимум) n - 1 множителей x для учета ее нулевого пространства. «Пропущенное» собственное значение равно d - 1 i , как видно из вычисления:е(Икс)D-1Jе(Икс)N-1ИксΣdя-1

D-1J(d1-1...dN-1)Tзнак равно(Σdя-1)(d1-1...dN-1)T

Отсюда следует , что характеристический полином , и F ( 1 ) является , как показано выше для DET ( я - Д - 1 Дж ) , 1 - Σ d - 1 я .е(Икс)знак равноИксN-1(Икс-Σdя-1)е(1)det(ID1J)1di1

Также отметим, что если , то 12 I - Q - J = 12 I - D + J - J = 12 I - D , диагональная матрица, определитель которой является просто произведением ее диагональных элементов.Q=DJ12IQJ=12ID+JJ=12ID


Хм ... на самом деле D - A, где A - матрица смежности G, поэтому я думаю, что этот результат может быть неверным. В частности, это будет означать, что число остовных деревьев графа G определяется его степенной последовательностью, которая не выполняется. QDAAGG
Jernej

Внедиагональные элементы обычно содержат как 0, так и -1. Л Д л Т разложение было предложено Victor использует симметрию и уменьшает главный член в подсчете работы от 2QLDLTк123N313N312я-Q-JQ

@Jernej: Если вы считаете, что то, что я изложил, неверно, я создал чат на основе этого Вопроса, где обсуждение может проходить без лишних комментариев.
hardmath

1

Если у вас есть структурированный способ перечисления графиков, для которых вы хотите рассчитать детерминанты, возможно, вы могли бы найти обновления низкого ранга, которые переносят вас из одного графика в другой.

Если это так, то вы могли бы использовать лемму определителя матрицы для дешевого вычисления определителя последующего графа, который нужно перечислить, используя ваши знания определителя текущего графа.

То есть для матрицы A и векторов U,v :

йе(A+UvT)знак равно(1+vTA-1U)йе(A)
N×мAN×N
йе(A+UВT)знак равнойе(ям+ВTA-1U)йе(A)

(A+UvT)-1знак равноA-1-A-1UvTA-11+vTA-1U

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.