It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center 。
8年前关闭。
升级到 3.0 后,RcppEigen 的 JacobiSVD 是否变慢了?
我使用 RcppEigen 的图书馆现在工作得很快了。
这是 R 上的测试代码:
-------------------------------------------------- --------
8年前关闭。
升级到 3.0 后,RcppEigen 的 JacobiSVD 是否变慢了?
我使用 RcppEigen 的图书馆现在工作得很快了。
> 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)
-------------------------------------------------- --------
最佳答案
切换到 R 3.0.0 应该不会对 RcppEigen
等包的执行方式产生影响。如果您看到性能下降,则可能是其他原因。
您还可以尝试通过使用 Armadillo 和/或 Eigen 直接在 C++ 中编译 SVD(如果您将它们安装在 R 之外,和/或您可以从一些修补程序中使用的 R 包中获取 header )。
关于RcppEigen svd 很慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16364947/
10-12 01:34