Skip to Content

svd {base}

Singular Value Decomposition of a Matrix
R 3.0.2


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))


a numeric or complex matrix whose SVD decomposition is to be computed. Logical matrices are coerced to numeric.
the number of left singular vectors to be computed. This must between   and n = nrow(x).
the number of right singular vectors to be computed. This must be between   and p = ncol(x).
logical. Defunct and ignored (with a warning for true values).


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, \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

For La.svd the return value replaces v by vt, the (conjugated if complex) transpose of v.

a vector containing the singular values of x, of length min(n, p).
a matrix whose columns contain the left singular vectors of x, present if nu > 0. Dimension c(n, nu).
a matrix whose columns contain the right singular vectors of x, present if nv > 0. Dimension c(p, nv).


Anderson. E. and ten others (1999) LAPACK Users' Guide. Third Edition. SIAM.
Available on-line at

Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S Language. Wadsworth & Brooks/Cole.

See Also

eigen, qr.


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

Documentation reproduced from R 3.0.2. License: GPL-2.