Ich versuchte, den Eigen-Solver der Eigen-Bibliothek in R mit Leistung zu verbessern:R Eigenlöser ist schneller als Eigen?
// [[Rcpp::export]]
MatrixXd Eigen4(const Map<MatrixXd> bM) {
SelfAdjointEigenSolver<MatrixXd> es(bM);
return(es.eigenvectors());
}
Doch wenn es auf einem 2000x2000 Matrix Vergleich:
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
Für das Ergebnis-Micro:
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 ist doppelt so schnell wie Eigen? Ich verwende die neuesten Versionen von R und RcppEigen.
Mache ich etwas falsch?
Möglicherweise durch Kopieren beim Übertragen zwischen 'SEXP' und' MatrixXd'. Außerdem sollten Sie ein geeignetes Benchmarking-Tool wie 'microbenchmark' verwenden. – nrussell
Ich kann nicht denken, dass das Kopieren einer 2000x2000-Matrix 10 Sekunden dauern würde. Ich fügte das Ergebnis des Microbenchmark hinzu. –