2016-07-18 32 views
0

我试图使用本征求解本征库中的R,以提高性能:R eigen求解器比Eigen的求解器要快吗?

// [[Rcpp::export]] 
MatrixXd Eigen4(const Map<MatrixXd> bM) { 
    SelfAdjointEigenSolver<MatrixXd> es(bM); 

    return(es.eigenvectors()); 
} 

然而,在2000×2000矩阵比较时:

n <- 5e3 
m <- 2e3 
b <- crossprod(matrix(rnorm(n*m), n)) 

print(system.time(test <- Eigen4(b))) # 18 sec 
print(system.time(test2 <- eigen(b, symmetric = TRUE))) # 8.5 sec 

对于微基准的结果:

Unit: seconds 
    expr       min  lq  mean median  uq  max neval 
Eigen4(b)     18.614694 18.687407 19.136380 18.952063 19.292021 20.812116 10 
eigen(b, symmetric = TRUE) 8.652628 8.663302 8.696543 8.676914 8.718517 8.831664 10 

R是Eigen的两倍? 我正在使用最新版本的R和RcppEigen。

我做错了什么?

+2

可能是由于在'SEXP'和'MatrixXd'之间传输时复制造成的。你也应该使用像microbenchmark这样的适当的基准测试工具。 – nrussell

+0

我不认为复制一个2000x2000矩阵需要10秒。 我添加了microbenchmark的结果。 –

回答

1

R的eigen是从LAPACK到Fortran函数的接口。 Eigen默认使用其通用的C++代码,但it can be configured可将外部BLAS/LAPACK后端用于某些密集矩阵操作,包括本征分解。根据您的体系结构和编译器,R的默认LAPACK可能会更快。如果您将R和Eigen配置为使用相同的高度优化平台特定的BLAS/LAPACK(例如Intel上的MKL),您应该得到几乎相同(和更好)的结果。

+0

我知道如何在R中使用MKL(通过Microsoft R Open),但不幸的是,我从来没有设法使用Eigen。 –