La conversión de matrices R a armadillo es realmente lenta

Una observación

Para matrices de tamaño mediano, los gastos generales al pasar matrices de R a C ++ son masivamente más lentos paraarma::mat tipos que paraNumericMatrix tipos. Como tomar alrededor de 250 veces más. Aquí hay un ejemplo mínimo

#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 ;
}

Entonces, en 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

Entonces, simplemente pasando una matriz comoarma::mat el tipo es aproximadamente 250 veces más lento queNumericMatrix. Eso es una locura! Entonces...

Preguntas que surgen

¿Que esta pasando? Por que esmat entonces mucho más lento queNumericMatrix?¿Hay una buena manera de lidiar con esto? Tengo un problema donde necesito usar unarma::mat para algunos álgebra matricial bastante simple en una función que se llama muchas veces. Actualmente estoy usandoarma tipos en todo momento, y mi código esmucho más lento de lo que esperaba (así es como terminé cocinando los ejemplos tontos anteriores). Una penalización de velocidad de 250x es tan importante que estoy a punto de reescribir grandes secciones de código para usarNumericMatrix tipos en todo. De hecho, podría terminar escribiendo mi propia función de multiplicación de matrices paraNumericMatrix y abandonararma tipos por completo. Pero antes de hacerlo, ¿hay alguna solución mejor?

(Aunque supongo que otra forma de leer esto no es esoarma::mat es lento para convertir de tipos R, pero que elNumericMatrix ¡el tipo es increíblemente eficiente!)

Respuestas a la pregunta(1)

Su respuesta a la pregunta