SVD                  package:Matrix                  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(dim(x)), nv = min(dim(x)))

_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 Lapack routine DGESVD. 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 Lapack,

                            *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 DGESVD. 

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

       u: a matrix whose columns contain the left eigenvectors of 'x'.

      vt: a matrix whose *rows* contain the right eigenvectors of 'x'. 
          That is, the 'vt' component is the transpose of *V* in the
          above decomposition.  This is different from the LINPACK
          result which returns *V*.

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

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

     'svd', 'eigen', 'qr'.

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

     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 %*% s$vt) < Eps)#  X = U D V'
     stopifnot(abs(D - t(s$u) %*% X %*% t(s$vt)) < Eps)#  D = U' X V

     X <- cbind(1, 1:7)
     str(s <- SVD(X)); D <- diag(s$d)
     stopifnot(abs(X - s$u %*% D %*% s$vt) < Eps)#  X = U D V'
     stopifnot(abs(D - t(s$u) %*% X %*% t(s$vt)) < Eps)#  D = U' X V

