

   svd {base}                                   R Documentation

   SSiinngguullaarr VVaalluuee DDeeccoommppoossiittiioonn ooff aa MMaattrriixx

   DDeessccrriippttiioonn::

        Compute the singular-value decomposition of a rectangu-
        lar matrix.

   UUssaaggee::

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

   AArrgguummeennttss::

          x: a matrix whose SVD decomposition is to be com-
             puted.

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

   DDeettaaiillss::

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

   VVaalluuee::

        The SVD decomposition of the matrix as computed by LIN-
        PACK,

                              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 eigenvec-
             tors of `x'.

          v: a matrix whose columns contain the right eigenvec-
             tors of `x'.

   RReeffeerreenncceess::

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

   SSeeee AAllssoo::

        `eigen', `qr'.

   EExxaammpplleess::

        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

