Msvd(Data: Array; Var U: Array; Var S: Array; Var V: Array);
Data. Входной параметр, двумерный массив размерности n×m;
U. Выходной параметр, двумерный массив размерности n×n;
S. Выходной параметр, одномерный массив размерности n;
V. Выходной параметр, двумерный массив размерности m×n.
Примечание. Параметр S является вектором и содержит элементы главной диагонали матрицы S, получаемой через сингулярное разложение.
Метод Msvd возвращает результат сингулярного разложения вещественной матрицы.
Сингулярное разложение (англ. singular value decomposition, SVD) - разложение прямоугольной вещественной матрицы на ортогональные матрицы U и V и диагональную матрицу S такие, что произведение U·S·V* дает исходную матрицу, где V* - транспонированная матрица к V.
Примечание. В «Форсайт. Аналитическая платформа» реализован экономный вариант SDV-разложения, из-за чего может не выполняться условие ортогональности матриц U и V: матрицы U и V могут получаться прямоугольными, а не квадратными, и произведения U·U* и V·V* могут не давать единичную матрицу. Единичную матрицу в таком случае будут давать только произведения U*·U и V*·V.
В общем случае соотношение Data = U·S·V* не имеет единственного решения. Метод Msvd рассчитывает один из вариантов.
Для выполнения примера добавьте ссылку на системную сборку MathFin.
Sub UserProc;
Var
dimcol, dimrow: Integer;
matr: Array Of Double;
i, j : Integer;
U, S, V : Array Of Double;
str : String;
Begin
dimrow := 3;
dimcol := 5;
// Входная матрица:
matr := New Double[dimrow, dimcol];
matr[0,0] := 1; matr[0,1] := 2; matr[0,2] := 0.2; matr[0,3] := 3; matr[0,4] := 8;
matr[1,0] := 0.5; matr[1,1] := -1; matr[1,2] := 2.2; matr[1,3] := 1.4; matr[1,4] := 2.1;
matr[2,0] := 0.7; matr[2,1] := 12; matr[2,2] := 10; matr[2,3] := 17; matr[2,4] := 0;
// Сингулярное разложение матрицы:
math.Msvd(matr, U, S, V);
Debug.WriteLine("U = ");
For i:=0 To U.GetUpperBound(1) Do
str := "";
For j:=0 To U.GetUpperBound(2) Do
str := str + U[i,j].ToString + "; ";
End For;
Debug.WriteLine(str);
End For;
Debug.WriteLine("S = " );
str := "";
For i:=0 To S.GetUpperBound(1) Do
str := str + S[i].ToString + "; ";
End For;
Debug.WriteLine(str);
Debug.WriteLine("V = " );
For i:=0 To V.GetUpperBound(1) Do
str := "";
For j:=0 To V.GetUpperBound(2) Do
str := str + V[i,j].ToString + "; ";
End For;
Debug.WriteLine(str);
End For;
End Sub UserProc;
После выполнения примера в окно консоли будет выведено SVD-разложение исходной матрицы.
U =
-0.165254675525592; 0.956389246351266; 0.240853693516601;
-0.0687713991903265; 0.232442607702064; -0.970175720567192;
-0.983850286817225; -0.176889919408434; 0.0273599989280314;
S =
23.4292158067414; 8.27738932394697; 2.55864664636389;
V =
-0.0379157195537407; 0.114624016244087; -0.0879692269494259;
-0.515080892728607; -0.053439935045388; 0.69575964983935;
-0.427792844804144; -0.128814480780358; -0.708427582151724;
-0.739141207464282; 0.0226470874442454; -0.0666621734228615;
-0.0625909699496861; 0.983310453119461; -0.0432023176062173;
См. также: