SingularValueDecompositionJacobiLow

Singular Value Decomposition, алгоритм Jacobi low level (lapack-функция GESVJ). В некоторых случаях вычисляет малые сингулярные значения и их сингулярные векторы гораздо более точно, чем другие подпрограммы SVD.

Вычисления для типа matrix<double>

bool  matrix::SingularValueDecompositionJacobiLow(
   ENUM_SVDJH_U   jobu,            // способ вычисления левых векторов
   ENUM_SVDJH_V   jobv,            // способ вычисления правых векторов
   double         ctol,            // порог сходимости (threshold for convergence), если jobu='C'
   ulong          mv,              // количество первых строк матрицы V, если jobv='A'
   vector&        S,               // вектор рассчитанных сингулярных значений
   matrix&        U,               // матрица рассчитанных левых векторов U
   matrix&        V,               // матрица рассчитанных левых векторов V
   vector&        work_results     // дополнительные результаты вычисления
   );

Вычисления для типа matrix<float>

bool  matrix::SingularValueDecompositionJacobiLow(
   ENUM_SVDJH_U   jobu,            // способ вычисления левых векторов
   ENUM_SVDJH_V   jobv,            // способ вычисления правых векторов
   double         ctol,            // порог сходимости (threshold for convergence), если jobu='C'
   ulong          mv,              // количество первых строк матрицы V, если jobv='A'
   vectorf&       S,               // вектор рассчитанных сингулярных значений
   matrixf&       U,               // матрица рассчитанных левых векторов U
   matrixf&       V,               // матрица рассчитанных левых векторов V
   vector&        work_results     // дополнительные результаты вычисления
   );

Вычисления для типа matrix<complex>

bool  matrix::SingularValueDecompositionJacobiLow(
   ENUM_SVDJH_U   jobu,            // способ вычисления левых векторов
   ENUM_SVDJH_V   jobv,            // способ вычисления правых векторов
   double         ctol,            // порог сходимости (threshold for convergence), если jobu='C'
   ulong          mv,              // количество первых строк матрицы V, если jobv='A'
   vector&        S,               // вектор рассчитанных сингулярных значений
   matrixc&       U,               // матрица рассчитанных левых векторов U
   matrixc&       V,               // матрица рассчитанных левых векторов V
   vector&        work_results     // дополнительные результаты вычисления
   );

Вычисления для типа matrix<complexf>

bool  matrix::SingularValueDecompositionJacobiLow(
   ENUM_SVDJH_U    jobu,                   // способ вычисления левых векторов
   ENUM_SVDJH_V    jobv,                   // способ вычисления правых векторов
   double          ctol,                   // порог сходимости (threshold for convergence), если jobu='C'
   ulong           mv,                     // количество первых строк матрицы V, если jobv='A'
   vectorf&        singular_values,        // вектор рассчитанных сингулярных значений S
   matrixcf&       u,                      // матрица рассчитанных левых векторов U
   matrixcf&       v,                      // матрица рассчитанных левых векторов V
   vectorf&        work_results            // дополнительные результаты вычисления
   );

Параметры

jobu

[in]  Значение из перечисления ENUM_SVDJL_U, определяющее способ вычисления левых сингулярных векторов.

jobv

[in]  Значение из перечисления ENUM_SVDJL_V, определяющее способ вычисления правых сингулярных векторов.

ctol

[in]  Порог сходимости, если jobu=SVDJLU_C. При других значениях jobu параметр игнорируется.

mv

[in]  Количество рассчитываемых строк матрицы V, если jobv=SVDJLV_A. При других значениях jobv параметр игнорируется.

S

[out]  Вектор сингулярныx значений.

В зависимости от значения scale = work(1), где scale — коэффициент масштабирования:

   Если scale = 1, S(1:n) содержит вычисленные сингулярные значения матрицы a. В процессе вычислений массив sva содержит евклидовы нормы столбцов итерационных матриц в массиве a.

   Если scale ≠ 1, сингулярные значения матрицы a вычисляются как scale*S(1:n). Такая факторизованная форма используется, если некоторые сингулярные значения a могут переполниться (overflow) или потеряться из-за недостаточной точности (underflow).

U

[out]  Матрица левых сингулярных векторов.

V

[out]  Матрица правых сингулярных векторов (нетранспонированная).

work_results

[out]  Вектор, состоящий из 7 статистик, полученных в результате расчёта.

work(1) = scale — коэффициент масштабирования, такой что scale*S(1:n) — вычисленные сингулярные значения A. См. также описание S.

work(2) — количество ненулевых вычисленных сингулярных значений.

work(3) — количество вычисленных сингулярных значений, превышающих порог потери точности (underflow).

work(4) — число итераций вращений Якоби, необходимых для численной сходимости.

work(5) = max_{i.NE.j} |COS(A(:,i),A(:,j))| в последнем цикле. Полезно в случаях, когда ?gesvj не сошёлся, так как позволяет оценить, можно ли использовать результат, а также применимо для пост-фактум анализа.

work(6) — наибольшее абсолютное значение среди синусов углов вращений Якоби в последнем цикле. Может быть полезно для пост-фактум анализа.

Возвращаемое значение

Возвращает true в случае успеха или false, если произошла ошибка.

Примечание

Количество строк матрицы не должно быть меньше количества столбцов.

ENUM_SVDJL_U

Перечисление, определяющее способ вычисления левых сингулярных векторов.

Идентификатор

Описание

SVDJLU_U

Левые сингулярные векторы, соответствующие ненулевым сингулярным значениям, вычисляются и возвращаются в ведущих столбцах матрицы A

SVDJLU_C          

Аналогично SVDJLU_U, но с возможностью управления уровнем численной ортогональности вычисленных левых сингулярных векторов.

SVDJLU_N

Матрица U не вычисляется.

ENUM_SVDJL_V

Перечисление, определяющее способ вычисления правых сингулярных векторов.

Идентификатор

Описание

SVDJLV_V

Матрица V вычисляется

SVDJLV_A

Вращения Якоби применяются к матрице V размером MV на N.

SVDJLV_N

Матрица V не вычисляется.

 

Смотри также

SingularValueDecompositionDC, SingularValueDecompositionQR