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
- Was ist los? Warum ist
mat
so viel langsamer alsNumericMatrix
? - 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, umNumericMatrix
Typen überall zu verwenden. Tatsächlich könnte ich am Ende meine eigene Matrixmultiplikationsfunktion fürNumericMatrix
schreiben und insgesamtarma
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!)
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. –