The LA_SVD procedure computes the singular value decomposition (SVD) of an n-columns by m-row array as the product of orthogonal and diagonal arrays:
A is real: A = U S VT
A is complex: A = U S VH
where U is an orthogonal array containing the left singular vectors, S is a diagonal array containing the singular values, and V is an orthogonal array containing the right singular vectors. The superscript T represents the transpose while the superscript H represents the Hermitian, or transpose complex conjugate.
If n < m then U has dimensions (n x m), S has dimensions (n x n), and VH has dimensions (n x n). If n ≥ m then U has dimensions (m x m), S has dimensions (m x m), and VH has dimensions (n x m). The following diagram shows the array dimensions:
LA_SVD is based on the following LAPACK routines:
Output Type |
LAPACK Routine |
QR Iteration |
Divide-and-conquer
|
Float |
sgesvd |
sgesdd |
Double |
dgesvd |
dgesdd |
Complex |
cgesvd |
cgesdd |
Double complex |
zgesvd |
zgesdd |
Examples
Construct a sample input array A, consisting of smoothed random values:
n = 100
m = 200
seed = 12321
a = SMOOTH(RANDOMN(seed, n, m, /DOUBLE, /RAN1), 5)
LA_SVD, a, w, u, v
arecon = u ## DIAG_MATRIX(w) ## TRANSPOSE(v)
PRINT, 'LA_SVD error:', MAX(ABS(arecon - a))
wfiltered = w
wfiltered[15:*] = 0.0
afiltered = u ## DIAG_MATRIX(wfiltered) ## TRANSPOSE(v)
percentVar = 100*(w^2)/TOTAL(w^2)
PRINT, 'LA_SVD Variance:', TOTAL(percentVar[0:14])
IDL prints:
LA_SVD error: 1.6209256e-014
LA_SVD variance: 82.802816
Note: More than 80% of the variance is contained in the 15 largest singular values.
Syntax
LA_SVD, Array, W, U, V [, /DOUBLE] [, /DIVIDE_CONQUER] [, STATUS=variable]
Arguments
Array
The real or complex array to decompose.
W
On output, W is a vector with MIN(m, n) elements containing the singular values.
U
On output, U is an orthogonal array with MIN(m, n) columns and m rows used in the decomposition of Array. If Array is complex then U will be complex, otherwise U will be real.
V
On output, V is an orthogonal array with MIN(m, n) columns and n rows used in the decomposition of Array. If Array is complex then V will be complex, otherwise V will be real.
Note: To reconstruct Array, you will need to take the transpose or Hermitian of V.
Keywords
DIVIDE_CONQUER
If this keyword is set, then the divide-and-conquer method is used to compute the singular vectors, otherwise, QR iteration is used. The divide-and-conquer method is faster at computing singular vectors of large matrices, but uses more memory and may produce less accurate singular values.
DOUBLE
Set this keyword to use double-precision for computations and to return a double-precision (real or complex) result. Set DOUBLE = 0 to use single-precision for computations and to return a single-precision (real or complex) result. The default is /DOUBLE if Array is double precision, otherwise the default is DOUBLE = 0.
STATUS
Set this keyword to a named variable that will contain the status of the computation. Possible values are:
- STATUS = 0: The computation was successful.
- STATUS > 0: The computation did not converge. The STATUS value specifies how many superdiagonals did not converge to zero.
Note: If STATUS is not specified, any error messages will output to the screen.
Version History
Resources and References
For details see Anderson et al., LAPACK Users' Guide, 3rd ed., SIAM, 1999.
See Also
LA_CHOLDC, LA_LUDC, SVDC