R eigen 求解器比 Eigen 的求解器快吗?
R eigen solver is faster than Eigen's one?
我尝试使用 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
微基准测试结果:
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。
我是不是做错了什么?
R 的 eigen
是从 LAPACK. Eigen uses its generic C++ code by default, although it can be configured 到 Fortran 函数的接口,用于使用外部 BLAS/LAPACK 后端进行某些密集矩阵运算,包括特征分解。根据您的体系结构和编译器,R 的默认 LAPACK 可能更快。如果您将 R 和 Eigen 配置为使用相同的高度优化的平台特定 BLAS/LAPACK(例如 Intel 上的 MKL),您应该获得几乎相同(和更好)的结果。
我尝试使用 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
微基准测试结果:
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。
我是不是做错了什么?
R 的 eigen
是从 LAPACK. Eigen uses its generic C++ code by default, although it can be configured 到 Fortran 函数的接口,用于使用外部 BLAS/LAPACK 后端进行某些密集矩阵运算,包括特征分解。根据您的体系结构和编译器,R 的默认 LAPACK 可能更快。如果您将 R 和 Eigen 配置为使用相同的高度优化的平台特定 BLAS/LAPACK(例如 Intel 上的 MKL),您应该获得几乎相同(和更好)的结果。