# create test matrix
set.seed(4943546)
nr <- 50
nc <- 2000
x <- matrix( rnorm( nr*nc), nrow=nr, ncol=nc )
tx <- t(x)
# SVD directly on matrix is SLOW:
system.time( val.x <- svd(x)$u )
# SVD on t(matrix) is FAST:
system.time( val.tx <- svd(tx)$v )
# and the results are equivalent:
max( abs(val.x) - abs(val.tx) )
# Time gap dissapears using fast.svd:
system.time( val.x <- fast.svd(x)$u )
system.time( val.tx <- fast.svd(tx)$v )
max( abs(val.x) - abs(val.tx) )
library(stats)
# prcomp directly on matrix is SLOW:
system.time( pr.x <- prcomp(x) )
# prcomp.fast is much faster
system.time( fast.pr.x <- fast.prcomp(x) )
# and the results are equivalent
max( pr.x$sdev - fast.pr.x$sdev )
max( abs(pr.x$rotation[,1:49]) - abs(fast.pr.x$rotation[,1:49]) )
max( abs(pr.x$x) - abs(fast.pr.x$x) )
# (except for the last and least significant component):
max( abs(pr.x$rotation[,50]) - abs(fast.pr.x$rotation[,50]) )
Run the code above in your browser using DataLab