This help topic is for R version 0.90. For the current version of R, try https://stat.ethz.ch/R-manual/R-patched/library/base/html/svd.html
svd {base}R Documentation

Singular Value Decomposition of a Matrix

Description

svd provides an interface to the LINPACK routine DSVDC. The singular value decompostion plays an important role in many statistical techniques.

Usage

svd(x, nu=min(n,p), nv=min(n,p))

Arguments

x

a matrix whose SVD decomposition is to be computed.

nu

the number of left eigenvectors to be computed. This must be one of 0, nrow(x) and ncol(x).

nv

the number of right eigenvectors to be computed. This must be one of 0, and ncol(x).

Value

The SVD decomposition of the matrix as computed by 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_{ii}. Equivalently, \bold{D = U' X V}, which is veryfied in the examples, below.

The components in the returned value correspond directly to the values returned by DSVDC.

d

a vector containing the singular values of x.

u

a matrix whose columns contain the left eigenvectors of x.

v

a matrix whose columns contain the right eigenvectors of x.

References

Dongarra, J. J., J. R. Bunch, C. B. Moler and G. W. Stewart (1978). LINPACK Users Guide, SIAM Publications, Philadelphia.

See Also

eigen, qr.

Examples

hilbert <- function(n) { i <- 1:n; 1 / outer(i - 1, i, "+") }
str(X <- hilbert(9)[,1:6])
str(s <- svd(X))
Eps <- 10 * .Machine$double.eps

D <- diag(s$d)
all(abs(X - s$u %*% D %*% t(s$v)) < Eps)# TRUE:  X = U D V'
all(abs(D - t(s$u) %*% X %*% s$v) < Eps)# TRUE:  D = U' X V

X <- cbind(1,1:7)
str(s <- svd(X)); D <- diag(s$d)
all(abs(X - s$u %*% D %*% t(s$v)) < Eps)# TRUE:  X = U D V'
all(abs(D - t(s$u) %*% X %*% s$v) < Eps)# TRUE:  D = U' X V

[Package base version 0.90 ]