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

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

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

      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_e_t_a_i_l_s:

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

_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 eigenvectors of `x'.

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

_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.

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

     `eigen', `qr'.

_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

