svd                   package:base                   R Documentation

_S_i_n_g_u_l_a_r _V_a_l_u_e _D_e_c_o_m_p_o_s_i_t_i_o_n _o_f _a _M_a_t_r_i_x

_D_e_s_c_r_i_p_t_i_o_n:

     Compute the singular-value decomposition of a rectangular matrix.

_U_s_a_g_e:

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

     La.svd(x, nu = min(n, p), nv = min(n, p),
            method = c("dgesdd", "dgesvd"))

_A_r_g_u_m_e_n_t_s:

       x: a matrix whose SVD decomposition is to be computed.

      nu: the number of left  singular vectors to be computed. This
          must be one of '0', 'nrow(x)' and 'ncol(x)', except for
          'method = "dgesdd"'.

      nv: the number of right singular vectors to be computed. This
          must be one of '0' and 'ncol(x)'.

 LINPACK: logical. Should LINPACK be used (for compatibility with R <
          1.7.0)?

  method: The LAPACK routine to use in the real case.

_D_e_t_a_i_l_s:

     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.

     'La.svd' provides an interface to both the LAPACK routines DGESVD
     and DGESDD.  The latter is usually substantially faster if
     singular vectors are required: see <URL:
     http://www.cs.berkeley.edu/~demmel/DOE2000/Report0100.html>. Most
     benefit is seen with an optimized BLAS system. Using
     'method="dgesdd"' requires IEEE 754 arithmetic.  Should this not
     be supported on your platform, 'method="dgesvd"' is used, with a
     warning.

     Computing the singular vectors is the slow part for large
     matrices.

     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.

_V_a_l_u_e:

     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 returned value is a list with components 

       d: a vector containing the singular values of 'x'.

       u: a matrix whose columns contain the left singular vectors of
          'x', present if 'nu > 0'

       v: a matrix whose columns contain the right singular vectors of
          'x', present if 'nv > 0'.


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

_R_e_f_e_r_e_n_c_e_s:

     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 <URL:
     http://www.netlib.org/lapack/lug/lapack_lug.html>.

_S_e_e _A_l_s_o:

     'eigen', 'qr'.

     'capabilities' to test for IEEE 754 arithmetic.

_E_x_a_m_p_l_e_s:

     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

