# svd: Singular Value Decomposition of a Matrix

## Description

Compute the singular-value decomposition of a rectangular matrix.

## Usage

 ```1 2 3``` ```svd(x, nu = min(n, p), nv = min(n, p), LINPACK = FALSE) La.svd(x, nu = min(n, p), nv = min(n, p)) ```

## Arguments

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

## Details

The singular value decomposition plays an important role in many statistical techniques. `svd` and `La.svd` provide two interfaces which differ in their return values.

Computing the singular vectors is the slow part for large matrices. The computation will be more efficient if both `nu <= min(n, p)` and `nv <= min(n, p)`, and even more so if 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.

## Value

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 conjugated for complex input), and \bold{D} is a diagonal matrix with the (non-negative) singular values D[i,i] in decreasing order. Equivalently, \bold{D = U' X V}, which is verified in the examples.

The returned value is a list with components

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

Recall that the singular vectors are only defined up to sign (a constant of modulus one in the complex case). If a left singular vector has its sign changed, changing the sign of the corresponding right vector gives an equivalent decomposition.

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

## Source

The main functions used are the LAPACK routines `DGESDD` and `ZGESDD`.

LAPACK is from https://www.netlib.org/lapack/ and its guide is listed in the references.

## References

Anderson. E. and ten others (1999) LAPACK Users' Guide. Third Edition. SIAM.
Available on-line at https://www.netlib.org/lapack/lug/lapack_lug.html.

The ‘Singular-value decomposition’ Wikipedia article.

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

`eigen`, `qr`.
 ```1 2 3 4 5 6``` ```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 ```