3
RcppEigen의 JacobiSVD가 3.0으로 업그레이드하면 속도가 느려 집니까? RcppEigen을 사용하는 내 라이브러리가 더 이상 작동하지 않습니다. ----------------------------RcppEigen svd가 매우 느림
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)
:
> 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의 테스트 코드입니다 ------------------------------
그런 게시물을 자르지 마십시오. 일반적으로 질문은 다른 사람들에게 가치가있을 수 있습니다. 가장 좋은 방법은 자신의 질문에 대답하는 것입니다. 추가 된 가치가 없다고 생각한다면 간단히 삭제할 수 있습니다. –
OP에 현재 평판 수준 (~ 80)의 삭제/삭제 플래그 권한이 있습니까? –