public class ComplexSVD extends Object implements Serializable
Complex
.
ComplexSVD
is based on the LAPACK routines ZGEBRD
and ZBDSQR
; see the LAPACK User's Guide by Anderson et al.
(1999).
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 unitary matrix U and a p x p unitary matrix V such that
$$U^H 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 k of A is the number of singular values
that are 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 \ge 0$} \\ {\left| \tau \right|\left\| A \right\|_2 } \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^H\).
Modifier and Type | Class and Description |
---|---|
static class |
ComplexSVD.DidNotConvergeException
The iteration did not converge
|
Constructor and Description |
---|
ComplexSVD(Complex[][] a)
Construct the singular value decomposition of a rectangular matrix with
default tolerance.
|
ComplexSVD(Complex[][] a,
double tol)
Construct the singular value decomposition of a rectangular matrix with
a given tolerance.
|
ComplexSVD(ComplexSVD svdProblem)
Copy constructor for the computation of the singular value decomposition
of a complex matrix.
|
Modifier and Type | Method and Description |
---|---|
int |
getInfo()
Returns convergence information about the singular values.
|
Complex[][] |
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.
|
Complex[][] |
getU()
Returns the left singular vectors.
|
Complex[][] |
getV()
Returns the right singular vectors.
|
public ComplexSVD(Complex[][] a, double tol) throws ComplexSVD.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 approximate
maximum singular value 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 computed.tol
- a double
scalar containing the tolerance
used to determine when a singular value is negligible.IllegalArgumentException
- is thrown if the row lengths
of input matrix a
are not equal (for
example, the matrix edges are "jagged") or if input
matrix a
is null or empty.ComplexSVD.DidNotConvergeException
- is thrown if the rank cannot
be determined because convergence was not obtained for
all singular values.public ComplexSVD(Complex[][] a) throws ComplexSVD.DidNotConvergeException
eps * Math.pow(eps, -0.125)
,
where eps = 2.2204460492503e-16. This tolerance is used to
determine rank. A singular value is considered negligible if the
singular value is less than or equal to this tolerance.a
- a Complex
matrix whose singular value
decomposition is to be computed.IllegalArgumentException
- is thrown if the row lengths
of input matrix a
are not equal (i.e. the
matrix edges are "jagged") or if input matrix a
is null or empty.ComplexSVD.DidNotConvergeException
- is thrown when the rank cannot be
determined because convergence was not obtained for all
singular values.public ComplexSVD(ComplexSVD svdProblem)
svdProblem
- the ComplexSVD
object to be copiedpublic 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 Complex[][] getU()
Complex
matrix containing the left singular
vectors.public Complex[][] getV()
Complex
matrix containing the right singular
vectors.public double[] getS()
double
array containing the singular values of
the matrix.public int getInfo()
int
indicating if the SVD algorithm applied to
the bidiagonally reduced input matrix a
has
converged. If the returned value is zero, the algorithm has
converged to a diagonal matrix. If the returned value
i
is greater than zero, then i
elements on the superdiagonal of the bidiagonal matrix have not
converged to zero.public Complex[][] getInverse()
Complex
matrix containing the generalized
inverse of the matrix used to construct this instance.Copyright © 2020 Rogue Wave Software. All rights reserved.