![]() |
Симметричная матрица A может быть представлена в виде A = Q·T·Q T, где Q - ортогональная матрица, T - трехдиагональная матрица. Аналогично, можно сказать, что матрица A приводится к трехдиагональной преобразованием подобия: Q T·A·Q = T.
Как и другие алгоритмы ортогональной факторизации (например, алгоритмы QR и LQ-разложения), этот алгоритм использует последовательность элементарных отражений для преобразования матрицы A. Преобразования применяются к матрице слева и справа, сохраняя на каждом этапе симметрию матрицы и последовательно устраняя внедиагональные элементы, пока не будут обнулены все элементы, кроме главной диагонали и двух побочных.
В результаты работы подпрограммы SMatrixTD матрица A замещается трехдиагональной матрицей T и последовательностью преобразований отражения, хранящейся в упакованной форме. Форма, в которой хранятся преобразования, и параметры подпрограммы подробно описаны в комментариях к ней, при этом во многом прослеживается аналогия с QR-разложением, которое использует нижнюю часть матрицы R для хранения матрицы Q, используя очень похожий формат хранения данных. Как и в случае с QR-разложением, представлена подпрограмма для "распаковки" матрицы Q : SMatrixTDUnpackQ.
Этот алгоритм перенесен из библиотеки LAPACK.
| C++ | ortfac.h | |
| C# | ortfac.cs | |
| MPFR | ortfac.h | |
| Delphi | ortfac.pas | |
| FreePascal | ortfac.pas | |
| VBA | ortfac.bas |
This article is intended for personal use only.
Исходный код на C#
Исходный код на C++
Исходный код на C++, использующий библиотеки MPFR/GMP.
Исходный код GMP доступен на сайте gmplib.org. Исходный код MPFR доступен на сайте www.mpfr.org.
Исходный код на Free Pascal.
Исходный код на Delphi.
Исходный код на VBA.
|
ALGLIB project, 1999-2010 |