2015-07-29 12 views
6

Eine BeobachtungUmwandlung von R-Matrizen zu armadillo ist wirklich langsam

Für mittelgroße Matrizen, die Gemeinkosten auf Matrizen von R auf C++ vorbei für arma::mat Typen massiv langsamer sind als bei NumericMatrix Typen. Etwa 250x so lange. Hier ist ein minimales Beispiel

#include <RcppArmadillo.h> 
// [[Rcpp::depends(RcppArmadillo)]] 
using namespace Rcpp; 
using namespace arma; 

// [[Rcpp::export]] 
double test_nm(NumericMatrix X) { 
    return 0.0 ; 
} 

// [[Rcpp::export]] 
double test_arma(mat X) { 
    return 0.0 ; 
} 

// [[Rcpp::export]] 
double test_nm_conv(NumericMatrix X) { 
    mat X_arma = as<mat>(X) ; 
    return 0.0 ; 
} 

Dann in R:

XX <- matrix(runif(10000), 2000, 50) 
microbenchmark(test_nm(XX), test_arma(XX), (XX)) 

Unit: microseconds 
       expr  min  lq  mean median  uq  max neval 
     test_nm(XX) 5.541 16.154 16.0781 17.577 18.876 48.024 100 
     test_arma(XX) 1280.946 1337.706 1404.0824 1361.237 1389.476 3385.868 100 
    test_nm_conv(XX) 1277.417 1338.835 1393.4888 1358.128 1386.101 4355.533 100 

Also nur eine Matrix als arma::mat Typen vorbei ist um 250x langsamer als NumericMatrix. Das ist verrückt! So ...

Fragen entstehen

  1. Was ist los? Warum ist matso viel langsamer als NumericMatrix?
  2. Gibt es einen guten Weg, damit umzugehen? Ich habe ein Problem, wo ich eine für einige ziemlich einfache Matrixalgebra in einer Funktion verwenden muss, die oft aufgerufen wird. Ich benutze derzeit arma Typen überall, und mein Code ist viel langsamer als ich erwartet hatte (so habe ich am Ende oben die dummen Beispiele oben kochen). Eine Geschwindigkeitsstrafe von 250x ist so eine große Sache, dass ich große Codeabschnitte umschreiben werde, um NumericMatrix Typen überall zu verwenden. Tatsächlich könnte ich am Ende meine eigene Matrixmultiplikationsfunktion für NumericMatrix schreiben und insgesamt arma Typen aufgeben. Aber bevor ich es tue, gibt es bessere Lösungen?

(Obwohl ich eine andere Art und Weise denke, dies zu lesen, ist nicht, dass arma::mat langsam von R-Typ zu konvertieren, sondern dass der NumericMatrix Typ ist erstaunlich effizient!)

Antwort

7

Ich glaube, das dann eine neue Armadillo Matrix erstellt kopiert den Inhalt Ihrer numerischen Matrix.

// [[Rcpp::export]] 
double test_const_arma(const mat& X) { 
    return 0.0 ; 
} 

Geschwindigkeitsvergleich auf meinem Rechner:

die NumericMatrix zu werfen arma :: Matte zu geben, sollten Sie die folgenden Befehle verwenden

microbenchmark(test_const_arma(XX), test_nm(XX), test_arma(XX), test_nm_conv(XX)) 
## Unit: microseconds 
##     expr min  lq  mean median  uq  max neval 
## test_const_arma(XX) 1.852 2.381 3.69014 2.7885 4.3490 11.994 100 
##   test_nm(XX) 1.925 2.455 3.47679 2.8535 3.5195 21.222 100 
##  test_arma(XX) 68.593 71.212 83.63055 73.4555 98.8070 278.981 100 
##  test_nm_conv(XX) 68.700 70.983 80.55983 73.1705 82.2665 183.484 100 
+0

können Sie einen kurzen Blick auf diese bitte [ ähnliche Frage] (http://stackoverflow.com/questions/43962398/update-rcppnumericmatrix-passed-by-reference-using-rcpparmadillo-subset)? Ich schätze es. –

Verwandte Themen