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), LINPACK = FALSE)
La.svd(x, nu = min(n, p), nv = min(n, p))

### Arguments

`x` |
a real or complex matrix whose SVD decomposition is to be computed. |

`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. Should LINPACK be used (for compatibility with
**R** < 1.7.0)? In this case `nu` must be `0` ,
`nrow(x)` or `ncol(x)` . |

### Details

The singular value decomposition plays an important role in many
statistical techniques. `svd`

and `La.svd`

provide two
slightly different interfaces. The main functions used are
the LAPACK routines DGESDD and ZGESVD; `svd(LINPACK = TRUE)`

provides an interface to the LINPACK routine DSVDC, purely for
backwards compatibility.

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: these can only be interpreted by
detailed study of the FORTRAN code.

### Value

The SVD decomposition of the matrix as computed by LAPACK/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 returned value is a list with components

`d` |
a vector containing the singular values of `x` , of
length `min(n, p)` . |

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

For `La.svd`

the return value replaces `v`

by `vt`

, the
(conjugated if complex) transpose of `v`

.

### References

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.

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.

### See Also

`eigen`

, `qr`

.

### Examples

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

[Package

*base* version 2.5.0

Index]