

svd {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 rectangu-
     lar 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 com-
          puted.

      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 LIN-
     PACK,

                           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 eigenvec-
          tors of `x'.

       v: a matrix whose columns contain the right eigenvec-
          tors of `x'.

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

     Dongarra, J. J., J. R. Bunch, C. B. Moler and G. W.
     Stewart (1978).  LINPACK Users Guide, SIAM Publica-
     tions, Philadelphia.

_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 <- 10 * .Machine$double.eps

     D <- diag(s$d)
     all(abs(X - s$u %*% D %*% t(s$v)) < Eps)# TRUE:  X = U D V'
     all(abs(D - t(s$u) %*% X %*% s$v) < Eps)# TRUE:  D = U' X V

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

