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

  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' provides an interface to the LINPACK routine DSVDC. `La.svd'
     provides an interface to 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.

     `La.svd' is preferred to `svd' for new projects, but it is not an
     exact replacement as it returns the transpose of the right
     singular vector matrix, and the signs of the singular vectors may
     differ from those given by `svd'.  (They may also differ between
     methods and between platforms.)

     Both functions handle complex matrices via LAPACK routine ZGESVD.

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

     Using `method="dgesdd"' requires IEEE 754 arithmetic.  Should this
     not be supported on your platform, `method="dgesvd"' is used, with
     a warning.

_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 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 singular vectors of
          `x'.

       v: a matrix whose columns contain the right singular vectors of
          `x'.


     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:

     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, "+") }
     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

