![]() |
Прямоугольная матрица A может быть представлена в виде A = Q·B·P T, где Q и P - ортогональные матрицы, B - двухдиагональная матрица.
Как и другие алгоритмы ортогональной факторизации (например, алгоритмы QR и LQ-разложения), этот алгоритм использует последовательность элементарных отражений для преобразования матрицы A. Преобразования применяются к матрице слева и справа, последовательно устраняя внедиагональные элементы, пока не будут обнулены все диагонали, кроме двух. Если число строк матрицы A не меньше числа столбцов, то мы получим верхнюю двухдиагональную матрицу, иначе мы получим нижнюю двухдиагональную матрицу.
В результаты работы подпрограммы RMatrixBD матрица A замещается двухдиагональной матрицей B и последовательностью преобразований отражения, хранящейся в упакованной форме. Форма, в которой хранятся преобразования, и параметры подпрограммы подробно описаны в комментариях к ней.
Во многом прослеживается аналогия с QR-разложением, которое использует нижнюю часть матрицы R для хранения матрицы Q, только здесь в упакованной форме хранится не одна, а две матрицы - матрица Q хранится под диагоналями матрицы B, а матрица P хранится над ними.
Как и в случае с QR-разложением, представлены подпрограммы для "распаковки" матриц Q и P: RMatrixBDUnpackQ и RMatrixBDUnpackPT. Первая подпрограмма позволяет получить всю матрицу Q или часть её столбцов, вторая подпрограмма позволяет получить всю матрицу P T или часть её строк. Подпрограмма RMatrixBDUnpackDiagonals позволяет "распаковать" диагонали двухдиагональной матрицы.
Этот алгоритм перенесен из библиотеки 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 |