特征解算器比特征解算器快?

时间:2016-07-18 09:42:26

标签: r rcpp eigen eigenvector

我尝试使用R中Eigen库的特征解算器来提高性能:

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

  return(es.eigenvectors());
}

然而,当在2000x2000矩阵上进行比较时:

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

对于microbenchmark的结果:

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。

我做错了吗?

1 个答案:

答案 0 :(得分:1)

R&#39; eigen是来自LAPACK的Fortran函数的接口。 Eigen默认使用其通用C ++代码,尽管it can be configured使用外部BLAS / LAPACK后端进行某些密集矩阵运算,包括特征分解。根据您的架构和编译器,R的默认LAPACK可能会更快。如果将R和Eigen配置为使用相同的高度优化的平台特定BLAS / LAPACK(例如Intel上的MKL),您应该得到几乎相同(且更好)的结果。