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

