RcppEigen svd 非常慢[关闭]
Posted
技术标签:
【中文标题】RcppEigen svd 非常慢[关闭]【英文标题】:RcppEigen svd is very slow [closed] 【发布时间】:2013-05-03 17:56:33 【问题描述】:升级到 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)
---------------------------------------------- ------------
【问题讨论】:
请不要这样破坏帖子。一般来说,问题可能对其他人有价值。最好的办法是让您回答自己的问题。如果你真的觉得没有附加价值,你可以直接删掉。 OP 是否有权在其当前声誉级别 (~80) 删除/标记删除? 【参考方案1】:切换到 R 3.0.0 应该不会对诸如 RcppEigen
之类的包的执行方式产生影响。如果您看到性能下降,则可能是其他原因。
您也可以尝试通过使用 Armadillo 和/或 Eigen 直接在 C++ 中编译 SVD 来解决问题(如果您将它们安装在 R 之外,和/或您可能会从用于一些修补的 R 包中获取头文件) .
【讨论】:
以上是关于RcppEigen svd 非常慢[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
亚马逊AWS非常慢,mysql和apache吃很多内存[关闭]
在我的嵌入式系统中填充外部 ram 中的帧缓冲区非常慢 [关闭]