Главная       Коммерческая поддержка       FAQ       Forum       Контакты       Английская версия

SVD-разложение двухдиагональной матрицы

Сингулярным разложением прямоугольной матрицы A размером MxN называется её представление в виде произведения A = U W V T, где U - ортогональная матрица размером MxM, W - диагональная матрица размером MxN с неотрицательными элементами на главной диагонали (сингулярными значениями), расположенными в порядке убывания, V - ортогональная матрица размером NxN.

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

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

Описание подпрограммы

Подпрограмма RMatrixBDSVD осуществляет SVD-разложение двухдиагональной матрицы, заданной массивами D и E (главная диагональ и побочная диагональ). В зависимости от параметра IsUpper матрица трактуется, как верхняя или нижняя двухдиагональная.

Алгоритм сохраняет полученные сингулярные значения в массиве D, замещая главную диагональ. Матрицы преобразования U и V T выводятся следующим способом. В алгоритм передаются переменные U и VT. Переменная U содержит матрицу с NRU строками и N столбцами, и умножается справа на матрицу преобразования U. Переменная VT содержит матрицу с N строками и NCVT столбцами, и умножается слева на матрицу преобразования V T.

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

Параметр IsFractionalAccuracyRequired контролирует погрешность, с которой находятся сингулярные значения. Если он равен True, то сингулярные значения находятся с одинаковой относительной погрешностью, иначе они находятся с одинаковой абсолютной погрешностью. Обычно имеет смысл устанавливать это параметр в False (что несколько увеличивает скорость работы), поскольку в большинстве практических применений повышенная точность нахождения малых сингулярных значений не нужна.

Manual entries

C++ bdsvd.h   
C# bdsvd.cs   
MPFR bdsvd.h   
Delphi bdsvd.pas   
FreePascal bdsvd.pas   
VBA bdsvd.bas   

This article is intended for personal use only.

Скачать ALGLIB

C#

Исходный код на C#

Downloads page

 

C++

Исходный код на C++

Downloads page

 

C++, арифметика высокой точности

Исходный код на C++, использующий библиотеки MPFR/GMP.

Исходный код GMP доступен на сайте gmplib.org. Исходный код MPFR доступен на сайте www.mpfr.org.

Downloads page

 

FreePascal

Исходный код на Free Pascal.

Downloads page

 

Delphi

Исходный код на Delphi.

Downloads page

 

Visual Basic

Исходный код на VBA.

Downloads page

 

 

ALGLIB project, 1999-2010