2013-05-03 3 views
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의 테스트 코드입니다 ------------------------------

+2

그런 게시물을 자르지 마십시오. 일반적으로 질문은 다른 사람들에게 가치가있을 수 있습니다. 가장 좋은 방법은 자신의 질문에 대답하는 것입니다. 추가 된 가치가 없다고 생각한다면 간단히 삭제할 수 있습니다. –

+0

OP에 현재 평판 수준 (~ 80)의 삭제/삭제 플래그 권한이 있습니까? –

답변

5

R 3.0.0으로 전환하면 어떤 방식으로 RcppEigen과 같은 패키지가 수행합니다. 실적이 악화 된 경우 다른 문제가 발생할 수 있습니다.

Armadillo 및/또는 Eigen을 사용하여 C++에서 SVD를 직접 컴파일하여 야구계를 시도 할 수도 있습니다 (R 외부에 설치 한 경우 및/또는 약간의 수정으로 사용 된 R 패키지의 헤더를 가져올 수 있음).).