|
| SVD () |
| default constructor for Rows>0 and Cols>0 More...
|
|
| SVD (int rows, int cols) |
| constructor for Rows=-1 or Cols=-1 (or both) More...
|
|
template<int R2, int C2, typename P2 , typename B2 > |
| SVD (const Matrix< R2, C2, P2, B2 > &m) |
|
template<int R2, int C2, typename P2 , typename B2 > |
void | compute (const Matrix< R2, C2, P2, B2 > &m) |
| Compute the SVD decomposition of M, typically used after the default constructor. More...
|
|
template<int Rows2, int Cols2, typename P2 , typename B2 > |
Matrix< Cols, Cols2, typename Internal::MultiplyType< Precision, P2 >::type > | backsub (const Matrix< Rows2, Cols2, P2, B2 > &rhs, const Precision condition=condition_no) |
|
template<int Size, typename P2 , typename B2 > |
Vector< Cols, typename Internal::MultiplyType< Precision, P2 >::type > | backsub (const Vector< Size, P2, B2 > &rhs, const Precision condition=condition_no) |
|
Matrix< Cols, Rows > | get_pinv (const Precision condition=condition_no) |
|
Precision | determinant () |
|
int | rank (const Precision condition=condition_no) |
|
Matrix< Rows, Min_Dim, Precision, Reference::RowMajor > | get_U () |
|
Vector< Min_Dim, Precision > & | get_diagonal () |
| Return the singular values as a vector. More...
|
|
Matrix< Min_Dim, Cols, Precision, Reference::RowMajor > | get_VT () |
|
void | get_inv_diag (Vector< Min_Dim > &inv_diag, const Precision condition) |
|
template<int Rows = Dynamic, int Cols = Rows, typename Precision = DefaultPrecision>
class TooN::SVD< Rows, Cols, Precision >
Performs SVD and back substitute to solve equations. Singular value decompositions are more robust than LU decompositions in the face of singular or nearly singular matrices. They decompose a matrix (of any shape)
into:
where
is a diagonal matrix of positive numbers whose dimension is the minimum of the dimensions of
. If
is tall and thin (more rows than columns) then
has the same shape as
and
is square (vice-versa if
is short and fat). The columns of
and the rows of
are orthogonal and of unit norm (so one of them lies in SO(N)). The inverse of
(or pseudo-inverse if
is not square) is then given by
If
is nearly singular then the diagonal matrix
has some small values (relative to its largest value) and these terms dominate
. To deal with this problem, the inverse is conditioned by setting a maximum ratio between the largest and smallest values in
(passed as the condition
parameter to the various functions). Any values which are too small are set to zero in the inverse (rather than a large number)
It can be used as follows to solve the
problem as follows:
Matrix<3> M;
Vector<3> c;
c = 2,3,4;
SVD<3> svdM(M);
Vector<3> x = svdM.backsub(c);
SVD<> (= SVD<-1>) can be used to create an SVD whose size is determined at run-time.
Definition at line 89 of file SVD.h.
template<int Rows = Dynamic, int Cols = Rows, typename Precision = DefaultPrecision>
template<int R2, int C2, typename P2 , typename B2 >
Construct the SVD decomposition of a matrix. This initialises the class, and performs the decomposition immediately.
Definition at line 109 of file SVD.h.
template<int Rows = Dynamic, int Cols = Rows, typename Precision = DefaultPrecision>
template<int Rows2, int Cols2, typename P2 , typename B2 >
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.
Definition at line 182 of file SVD.h.
template<int Rows = Dynamic, int Cols = Rows, typename Precision = DefaultPrecision>
template<int Size, typename P2 , typename B2 >
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.
Definition at line 195 of file SVD.h.
template<int Rows = Dynamic, int Cols = Rows, typename Precision = DefaultPrecision>
template<int R2, int C2, typename P2 , typename B2 >
void TooN::SVD< Rows, Cols, Precision >::compute |
( |
const Matrix< R2, C2, P2, B2 > & |
m | ) |
|
|
inline |
Compute the SVD decomposition of M, typically used after the default constructor.
Definition at line 119 of file SVD.h.
template<int Rows = Dynamic, int Cols = Rows, typename Precision = DefaultPrecision>
Calculate (pseudo-)inverse of the matrix. This is not usually needed: if you need the inverse just to multiply it by a matrix or a vector, use one of the backsub() functions, which will be faster. See the detailed description of the pseudo-inverse and condition variables.
Definition at line 206 of file SVD.h.