fast.svd {corpcor} | R Documentation |
Fast Singular Value Decomposition
Description
fast.svd
returns the singular value decomposition of
a rectangular real matrix
where and
are orthogonal matrices with
and
, and
is a diagonal matrix containing the
singular values (see
svd
).
The main difference to the native version svd
is that
fast.svd
is substantially faster for "fat" (small n, large p)
and "thin" (large n, small p) matrices.
In this case the decomposition of can be
greatly sped up by first computing the SVD of either
(fat matrices) or
(thin matrices), rather than that of
.
A second difference to svd
is that fast.svd
only
returns the positive singular values (thus the dimension of
always equals the rank of
). Note that the singular
vectors computed by
fast.svd
may differ in sign from those computed
by svd
.
Usage
fast.svd(m, tol)
Arguments
m |
matrix |
tol |
tolerance - singular values larger than
tol are considered non-zero (default value:
|
Details
For "fat" (small n, large p) the SVD decomposition of
yields
As the matrix has dimension n x n only, this is faster to compute
than SVD of
. The
matrix is subsequently obtained by
Similarly, for "thin" (large n, small p), the decomposition of
yields
which is also quick to compute as has only dimension p x p. The
matrix is then computed via
Value
A list with the following components:
d |
a vector containing the positive singular values |
u |
a matrix with the corresponding left singular vectors |
v |
a matrix with the corresponding right singular vectors |
Author(s)
Korbinian Strimmer (https://strimmerlab.github.io).
See Also
Examples
# load corpcor library
library("corpcor")
# generate a "fat" data matrix
n = 50
p = 5000
X = matrix(rnorm(n*p), n, p)
# compute SVD
system.time( (s1 = svd(X)) )
system.time( (s2 = fast.svd(X)) )
eps = 1e-10
sum(abs(s1$d-s2$d) > eps)
sum(abs(abs(s1$u)-abs(s2$u)) > eps)
sum(abs(abs(s1$v)-abs(s2$v)) > eps)