gpt4 book ai didi

RcppEigen svd 很慢

转载 作者:行者123 更新时间:2023-12-03 18:40:29 34 4
gpt4 key购买 nike

<分区>

升级到 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)

-------------------------------------------- ----------

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com