![]() |
LDLT-разложение является обобщением разложения Холецкого для знаконеопределенных симметричных матриц. В отличие от разложения Холецкого, которое существует только у симметричной положительно определенной матрицы, LDLT-разложение существует у любой симметричной матрицы.
При LDLT-разложении матрица A представляется в виде A = L·D·L T или A = U·D·U T. Отличий от разложения Холецкого два. Во-первых, появилась матрица D - блочно-диагональная матрица с блоками размером 1x1 или 2x2. Во-вторых, матрицы L и U являются не треугольными матрицами, а произведениями треугольных матриц и матриц перестановок:
L = P1 L1 ·...·Pk Lk ·...
Здесь v - столбец, ширина s которого равна ширине k-ого блока на диагонали матрицы D (1 или 2), а высота - k-s для матрицы Uk , n-k-s+1 - для матрицы Lk .
Можно видеть, что структура LDLT-разложения значительно сложнее, чем у разложения Холецкого или LU-разложения, но это разложение позволяет факторизовать любую симметричную матрицу (в отличие от разложения Холецкого), и выполняется быстрее, чем более общее LU-разложение. Следует отметить, что LDLT-разложение по скорости находится между разложением Холецкого и LU-разложением, так что если есть возможность применить разложение Холецкого, то оно все же является предпочтительным вариантом.
Разложение матрицы осуществляется подпрограммой SMatrixLDLT, которая принимает матрицу A, заданную верхним или нижним треугольником, и замещает её матрицами L и D (или U и D), хранящимися в компактной форме (описанной в комментариях к программе).
Алгоритмы обращения матриц и решения систем линейных уравнений работают с матрицами, заданными именно в компактной форме, а сами по себе матрицы L или U обычно не представляют интереса, так что подпрограмм для их "распаковки" не предусмотрено. Подробное описание структуры матриц L и U есть в комментариях к подпрограммам, так что в случае необходимости программист может самостоятельно произвести "распаковку" матриц.
Этот алгоритм перенесен из библиотеки LAPACK.
| C++ | ldlt subpackage | |
| C# | ldlt subpackage |
This article is intended for personal use only.
Исходный код на C#
Исходный код на C++
Исходный код на C++, использующий библиотеки MPFR/GMP.
Исходный код GMP доступен на сайте gmplib.org. Исходный код MPFR доступен на сайте www.mpfr.org.
Исходный код на Free Pascal.
Исходный код на Delphi.
Исходный код на VB.NET.
Исходный код на VBA.
Исходный код на Python (CPython и IronPython).
|
ALGLIB® - numerical analysis library, 1999-2012. |