3
RcppEigen的JacobiSVD在升級到3.0時變慢了嗎? 我的庫使用RcppEigen現在工作得很快。RcppEigen svd很慢
> n<-1000
> m<-matrix(rnorm(n*n),n,n)
> unix.time(s1<-svd(m)) # R
user system elapsed
10.376 0.028 10.407
> unix.time(s2<-svdArma(m)) # RcppArmadillo
user system elapsed
22.997 0.000 23.001
> unix.time(s3<-svdEigen(m)) # RcppEigen
user system elapsed
180.708 0.000 180.712
這裏是R上的測試代碼:
library(inline)
codeArma='
arma::mat m = Rcpp::as<arma::mat>(m_);
arma::mat u;
arma::vec s;
arma::mat v;
arma::svd(u,s,v,m);
return List::create(Rcpp::Named("u")=u,
Rcpp::Named("d")=s,
Rcpp::Named("v")=v);
'
svdArma <- cxxfunction(signature(m_="matrix"),codeArma, plugin="RcppArmadillo")
#-----------------------------------------------------------------------
codeEigen='
const Eigen::Map<Eigen::MatrixXd> m (as<Eigen::Map<Eigen::MatrixXd> >(m_));
Eigen::JacobiSVD <Eigen::MatrixXd>svd(m,
Eigen::ComputeThinU|Eigen::ComputeThinV);
return List::create(Rcpp::Named("u")=svd.matrixU(),
Rcpp::Named("d")=svd.singularValues(),
Rcpp::Named("v")=svd.matrixV());
'
svdEigen <- cxxfunction(signature(m_="matrix"), codeEigen, plugin="RcppEigen")
#------------------------------------------------------------------------
n<-1000
m<-matrix(rnorm(n*n),n,n)
system.time(s1<-svd(m)) # R
m1<-s1$u %*% diag(s1$d) %*% t(s1$v)
all.equal(m,m1)
system.time(s2<-svdArma(m)) # Armadillo
m2<-s2$u %*% diag(array(s2$d)) %*% t(s2$v)
all.equal(m,m2)
system.time(s3<-svdEigen(m)) # Eigen
m3<-s3$u %*% diag(s3$d) %*% t(s3$v)
all.equal(m,m3)
請不要破壞這樣的帖子。一般來說,問題可能對其他人有價值。最好的辦法是讓你回答你自己的問題。如果你確實覺得沒有附加價值,你可以簡單地刪除它。 – 2013-05-03 19:37:37
OP是否有權刪除/標記在當前聲譽級別(〜80)內刪除? – 2013-05-03 21:20:24