IMath.Msvd

Синтаксис

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* могут не давать единичную матрицу. Единичную матрицу в таком случае будут давать только произведения UU и VV.

В общем случае соотношение 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(1Do
        str := "";
        For j:=0 To U.GetUpperBound(2Do
            str := str + U[i,j].ToString + "; ";
        End For;
        Debug.WriteLine(str);
    End For;
    Debug.WriteLine("S = " );
    str := "";
    For i:=0 To S.GetUpperBound(1Do
        str := str + S[i].ToString + "; ";
    End For;    
    Debug.WriteLine(str);
    Debug.WriteLine("V = " );
    For i:=0 To V.GetUpperBound(1Do
        str := "";
        For j:=0 To V.GetUpperBound(2Do
            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;

См. также:

IMath