|
TooN 2.0.0-beta8
|
Performs SVD and back substitute to solve equations. More...
Public Member Functions | |
| template<class Precision2 , class Base > | |
| GR_SVD (const Matrix< M, N, Precision2, Base > &A) | |
| const Matrix< M, N, Precision > & | get_U () |
| const Matrix< N, N, Precision > & | get_V () |
| const Vector< N, Precision > & | get_diagonal () |
| Precision | get_largest_singular_value () |
| Precision | get_smallest_singular_value () |
| int | get_smallest_singular_value_index () |
| void | get_inv_diag (Vector< N > &inv_diag, const Precision condition) |
| template<int Rows2, int Cols2, typename P2 , typename B2 > | |
| Matrix< N, Cols2, typename Internal::MultiplyType < Precision, P2 >::type > | backsub (const Matrix< Rows2, Cols2, P2, B2 > &rhs, const Precision condition=1e9) |
| template<int Size, typename P2 , typename B2 > | |
| Vector< N, typename Internal::MultiplyType < Precision, P2 >::type > | backsub (const Vector< Size, P2, B2 > &rhs, const Precision condition=1e9) |
| Matrix< N, M, Precision > | get_pinv (const Precision condition=1e9) |
| void | reorder () |
Static Public Attributes | |
| static const int | BigDim = M>N?M:N |
| static const int | SmallDim = M<N?M:N |
Protected Member Functions | |
| void | Bidiagonalize () |
| void | Accumulate_RHS () |
| void | Accumulate_LHS () |
| void | Diagonalize () |
| bool | Diagonalize_SubLoop (int k, Precision &z) |
Protected Attributes | |
| Vector< N, Precision > | vDiagonal |
| Vector< BigDim, Precision > | vOffDiagonal |
| Matrix< M, N, Precision > | mU |
| Matrix< N, N, Precision > | mV |
| int | nError |
| int | nIterations |
| Precision | anorm |
Performs SVD and back substitute to solve equations.
This code is a c++ translation of the FORTRAN routine give in George E. Forsythe et al, Computer Methods for Mathematical Computations, Prentice-Hall 1977. That code itself is a translation of the ALGOL routine by Golub and Reinsch, Num. Math. 14, 403-420, 1970.
N.b. the singular values returned by this routine are not sorted. N.b. this also means that even for MxN matrices with M<N, N singular values are computed and used.
The template parameters WANT_U and WANT_V may be set to false to indicate that U and/or V are not needed for a minor speed-up.
| void get_inv_diag | ( | Vector< N > & | inv_diag, |
| const Precision | condition | ||
| ) |
Return the pesudo-inverse diagonal.
The reciprocal of the diagonal elements is returned if the elements are well scaled with respect to the largest element, otherwise 0 is returned.
| inv_diag | Vector in which to return the inverse diagonal. |
| condition | Elements must be larger than this factor times the largest diagonal element to be considered well scaled. |
Referenced by GR_SVD< M, N, Precision, WANT_U, WANT_V >::backsub(), and GR_SVD< M, N, Precision, WANT_U, WANT_V >::get_pinv().
| Matrix<N,Cols2, typename Internal::MultiplyType<Precision,P2>::type > backsub | ( | const Matrix< Rows2, Cols2, P2, B2 > & | rhs, |
| const Precision | condition = 1e9 |
||
| ) |
Calculate result of multiplying the (pseudo-)inverse of M by another matrix.
For a matrix
, this calculates
by back substitution (i.e. without explictly calculating the (pseudo-)inverse). See the detailed description for a description of condition variables.
References GR_SVD< M, N, Precision, WANT_U, WANT_V >::get_inv_diag().
| Vector<N, typename Internal::MultiplyType<Precision,P2>::type > backsub | ( | const Vector< Size, P2, B2 > & | rhs, |
| const Precision | condition = 1e9 |
||
| ) |
Calculate result of multiplying the (pseudo-)inverse of M by a vector.
For a vector
, this calculates
by back substitution (i.e. without explictly calculating the (pseudo-)inverse). See the detailed description for a description of condition variables.
References GR_SVD< M, N, Precision, WANT_U, WANT_V >::get_inv_diag().
1.7.4