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 的图书馆现在工作得很快了。
> 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