public class SVD extends Object
double
.
SVD
is based on the LINPACK routine SSVDC
; see
Dongarra et al. (1979).
Let n be the number of rows in A
and let p be the number of columns in
A. For any
n x p matrix
A, there exists an n x n
orthogonal matrix U and a p x p
orthogonal matrix V such that
$$U^T A V = \left\{ \begin{array}{cl} \left[ \begin{array}{l} \Sigma \\ 0 \end{array} \right] & \mbox{if $n \ge p$} \\ \left[ \Sigma \,\, 0 \right] & \mbox{if $n \le p$} \end{array} \right.$$
where \(\Sigma = {\rm diag}(\sigma_1, \ldots, \sigma_m)\), and \(m = \min(n, p)\). The scalars \(\sigma_1 \geq \sigma_2 \geq \ldots \geq \sigma_m \geq 0\) are called the singular values of A. The columns of U are called the left singular vectors of A. The columns of V are called the right singular vectors of A.
The estimated rank of A is the number of
\(\sigma_k\) that is larger than a tolerance \(\eta\).
If \(\tau\) is the parameter tol
in the
program, then
$$\eta = \left\{ \begin{array}{cl} \tau \hfill & \mbox {if $\tau \gt 0$} \\ {\left| \tau \right|\left\| A \right\|_\infty } \hfill & \mbox {if $\tau \lt 0$} \end{array} \right.$$
The Moore-Penrose generalized inverse of the matrix is computed by partitioning the matrices U, V and \(\Sigma\) as \(U = (U_1,U_2)\), \(V = (V_1,V_2)\) and \(\Sigma_1 = {\rm diag}(\sigma_1,\ldots,\sigma_k)\) where the "1" matrices are k by k. The Moore-Penrose generalized inverse is \(V_1 \Sigma_1^{-1} U_1^T\).
Modifier and Type | Class and Description |
---|---|
static class |
SVD.DidNotConvergeException
The iteration did not converge
|
Constructor and Description |
---|
SVD(double[][] a)
Construct the singular value decomposition of a rectangular matrix with
default tolerance.
|
SVD(double[][] a,
double tol)
Construct the singular value decomposition of a rectangular matrix with a given tolerance.
|
Modifier and Type | Method and Description |
---|---|
int |
getInfo()
Returns convergence information about S, U, and V.
|
double[][] |
getInverse()
Compute the Moore-Penrose generalized inverse.
|
int |
getRank()
Returns the rank of the matrix used to construct this instance.
|
double[] |
getS()
Returns the singular values.
|
double[][] |
getU()
Returns the left singular vectors.
|
double[][] |
getV()
Returns the right singular vectors.
|
double[][] |
inverse()
Deprecated.
Method name does not adhere to the Java naming conventions.
Use
SVD.getInverse() instead. |
public SVD(double[][] a, double tol) throws SVD.DidNotConvergeException
tol
is positive, then a singular value is
considered negligible if the singular value is less than or equal to
tol
. If tol
is negative, then a singular value is considered negligible
if the singular value is less than or equal to the absolute value of the product of
tol
and the infinity norm of the input matrix. In the latter case, the
absolute value of tol
generally contains an estimate of the level of
the relative error in the data.a
- a double
matrix for which the singular value decomposition
is to be computedtol
- a double
scalar containing the tolerance used
to determine when a singular value is negligibleIllegalArgumentException
- is thrown when the row lengths of
input matrix a are not equal (for example, the matrix edges
are "jagged")SVD.DidNotConvergeException
- is thrown when the rank cannot be determined
because convergence was not obtained for all singular valuespublic SVD(double[][] a) throws SVD.DidNotConvergeException
a
- a double
matrix for which the singular value
decomposition is to be computedIllegalArgumentException
- is thrown when the row lengths of
input matrix a are not equal (i.e. the matrix edges are
"jagged")SVD.DidNotConvergeException
public int getRank()
int
scalar containing the rank of the matrix
used to construct this instance. The estimated rank of the input
matrix is the number of singular values which are larger than a
tolerance.public double[][] getU()
double
matrix containing the left singular
vectorspublic double[][] getV()
double
matrix containing the right singular
vectorspublic double[] getS()
double
array containing the singular values of the matrixpublic int getInfo()
@Deprecated public double[][] inverse()
SVD.getInverse()
instead.double
matrix containing the generalized
inverse of the matrix used to construct this instancepublic double[][] getInverse()
double
matrix containing the generalized
inverse of the matrix used to construct this instanceCopyright © 2020 Rogue Wave Software. All rights reserved.