Как сделать разложение ЛПНП, когда все, что у меня есть, это LU-решатель, который всегда применяет поворот?

Я надеюсь, что мне просто не хватает простого трюка с матричной арифметикой, но проблема, с которой я сталкиваюсь, заключается в том, что все, к чему у меня есть доступ, это LU-решатель (Matlab LU* или SuperLU), и мне нужно разложение LDL симметричного матрица А. Итак, я подумал: "Нет проблем", поскольку разложение LU уникально, а разложение LDL уникально, тогда D - это просто диагонали U.

Но проблема в том, что он никогда не делает A = LU, а скорее PA = LU, а PA не симметричен! Поэтому я не могу понять, как определить A = LDL из PA = LU

Есть ли что-то легкое, что я могу сделать, чтобы это исправить? Любая помощь с благодарностью.

PS Упреждающий: Да, мне действительно, действительно, действительно, действительно нужно разложение ЛПНП. Не существует не другого варианта. Да, я уверен. Нет, я не нуждаюсь в том, чтобы я изложил вам конкретную проблему, чтобы подтвердить, что мне действительно нужно разложение ЛПНП.

* Я знаю, что Matlab имеет свою собственную функцию LDL, но я использую ее только для прототипирования, и библиотеки, доступные мне в C++ (в основном SuperLU), похоже, не имеют такой функции.

1 ответ

Используйте [L,U] = LU_decomposition(A). Затем вычислите D = U inv (транспонировать (L)). Тогда оно имеет вид A = L U = L * D * L '. Обратите внимание, что D - верхняя правая треугольная, поскольку inv (transpose (L)) и U - верхняя правая треугольная.

Очевидно, что если A симметричен, то D симметричен, и у вас есть разложение LDLT. Надеюсь, это поможет.

Ура, Мартин

Другие вопросы по тегам