svd {base} | R Documentation |
Compute the singular-value decomposition of a rectangular matrix.
svd(x, nu = min(n, p), nv = min(n, p), LINPACK = FALSE) La.svd(x, nu = min(n, p), nv = min(n, p))
x |
a numeric, logical or complex matrix whose SVD decomposition is to be computed. |
nu |
the number of left singular vectors to be computed.
This must between |
nv |
the number of right singular vectors to be computed.
This must be between |
LINPACK |
logical. Should LINPACK be used (for compatibility with
R < 1.7.0)? In this case |
The singular value decomposition plays an important role in many
statistical techniques. svd
and La.svd
provide two
slightly different interfaces.
Computing the singular vectors is the slow part for large matrices.
The computation will be more efficient if nu <= min(n, p)
and
nv <= min(n, p)
, and even more efficient if one or both are zero.
Unsuccessful results from the underlying LAPACK code will result in an
error giving a positive error code (most often 1
): these can
only be interpreted by detailed study of the FORTRAN code but mean
that the algorithm failed to converge.
The SVD decomposition of the matrix as computed by LAPACK/LINPACK,
\bold{X = U D V'},
where \bold{U} and \bold{V} are orthogonal, \bold{V'} means V transposed, and \bold{D} is a diagonal matrix with the singular values D[i,i]. Equivalently, \bold{D = U' X V}, which is verified in the examples, below.
The returned value is a list with components
d |
a vector containing the singular values of |
u |
a matrix whose columns contain the left singular vectors of
|
v |
a matrix whose columns contain the right singular vectors of
|
For La.svd
the return value replaces v
by vt
, the
(conjugated if complex) transpose of v
.
LINPACK = TRUE
(for compatibility with R < 1.7.0) was formally
deprecated in R 2.15.2.
The main functions used are the LAPACK routines DGESDD
and
ZGESVD
; svd(LINPACK = TRUE)
provides an interface to the
LINPACK routine DSVDC
.
LAPACK and LINPACK are from http://www.netlib.org/lapack and http://www.netlib.org/linpack and their guides are listed in the references.
Anderson. E. and ten others (1999)
LAPACK Users' Guide. Third Edition. SIAM.
Available on-line at
http://www.netlib.org/lapack/lug/lapack_lug.html.
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.
Dongarra, J. J., Bunch, J. R., Moler, C. B. and Stewart, G. W. (1978) LINPACK Users Guide. Philadelphia: SIAM Publications.
hilbert <- function(n) { i <- 1:n; 1 / outer(i - 1, i, "+") } X <- hilbert(9)[, 1:6] (s <- svd(X)) D <- diag(s$d) s$u %*% D %*% t(s$v) # X = U D V' t(s$u) %*% X %*% s$v # D = U' X V