svd {base} | R Documentation

## Singular Value Decomposition of a Matrix

### Description

Compute the singular-value decomposition of a rectangular matrix.

### 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)`.

### Details

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

### Value

The SVD decomposition of the matrix as computed by LINPACK,

X = U D V',

where U and V are orthogonal, V' means V transposed, and D is a diagonal matrix with the singular values D[i,i]. Equivalently, D = U' X V, which is verified 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., Bunch, J. R., Moler, C. B. and Stewart, G. W. (1978) LINPACK Users Guide. Philadelphia: SIAM Publications.

### 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 <- 100 * .Machine$double.eps

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

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