2016-07-18 9 views
0

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?

+2

Möglicherweise durch Kopieren beim Übertragen zwischen 'SEXP' und' MatrixXd'. Außerdem sollten Sie ein geeignetes Benchmarking-Tool wie 'microbenchmark' verwenden. – nrussell

+0

Ich kann nicht denken, dass das Kopieren einer 2000x2000-Matrix 10 Sekunden dauern würde. Ich fügte das Ergebnis des Microbenchmark hinzu. –

Antwort

1

R eigen ist eine Schnittstelle zu Fortran Funktionen von LAPACK. Eigen verwendet seinen generischen C++ - Code standardmäßig, obwohl it can be configured externe BLAS/LAPACK-Backends für bestimmte dichte Matrixoperationen, einschließlich Eigenkomposition, verwendet. Abhängig von Ihrer Architektur und Ihren Compilern ist Rs Standard-LAPACK möglicherweise schneller. Wenn Sie sowohl R als auch Eigen konfigurieren, um dasselbe hoch optimierte plattformspezifische BLAS/LAPACK (z. B. MKL auf Intel) zu verwenden, sollten Sie praktisch identische (und bessere) Ergebnisse erhalten.

+0

Ich weiß, wie man das MKL in R verwendet (durch Microsoft R Open), aber ich habe es leider nie mit Eigen geschafft. –