2016-07-18 57 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。 –