2013-05-03 125 views
3

RcppEigen的JacobiSVD在升級到3.0時變慢了嗎? 我的庫使用RcppEigen現在工作得很快。RcppEigen svd很慢

> 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) 

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

+2

請不要破壞這樣的帖子。一般來說,問題可能對其他人有價值。最好的辦法是讓你回答你自己的問題。如果你確實覺得沒有附加價值,你可以簡單地刪除它。 – 2013-05-03 19:37:37

+0

OP是否有權刪除/標記在當前聲譽級別(〜80)內刪除? – 2013-05-03 21:20:24

回答

5

切換到R 3.0.0應該不會看到如何影響包如RcppEigen執行。如果您看到表現出現迴歸,可能會出現其他情況。

你也可以嘗試通過使用Armadillo和/或Eigen直接在C++中編譯SVD(如果你將它們安裝在R之外,和/或你可以從R包中獲得頭文件並使用一些修補程序)。