2012-12-08 3 views
11

Come posso ridimensionare in Rcpp a NumericVector?Come ridimensionare un NumericVector?

Quando utilizzo la funzione push_back per questo, il programma rallenta. Ma non ci sono le funzioni .resize() o .reserve(). (Quando ho già un NumericVector con la dimensione desiderata, posso usare il costruttore di copia per ottenere la dimensione corretta del NumericVector. Questo è in questo caso molto più veloce di utilizzo di push_back)

+0

Come ha spiegato Dirk, c'è ben poche possibilità avremo un metodo 'reserve'. Potremmo implementare un 'ridimensionamento '. –

risposta

17

Se si preferisce la Idiomi C++, utilizzare std::vector<double> e restituirlo alla fine dove verrà convertito tramite un numero implicito wrap() in un vettore R. È anche possibile utilizzare i vettori Armadillo o Eigen tramite RcppArmadillo e RcppEigen.

I nostri oggetti sono involucri poco profondi attorno all'oggetto R, quindi push_back su, ad esempio, uno Rcp::NumericVector richiede sempre una copia completa. Questo è noto e documentato.

Edit: Così, per completezza, ecco un esempio utilizzando RcppArmadillo:

// [[Rcpp::depends(RcppArmadillo)]] 
#include <RcppArmadillo.h> 

// [[Rcpp::export]] 
arma::vec shrink(arma::vec x) { 
    arma::vec y = x; 
    y.resize(y.size()-2); 
    return y; 
} 

quale possiamo distribuire tramite

R> Rcpp::sourceCpp('/tmp/vec.cpp') 
R> shrink(1:10) 
    [,1] 
[1,] 1 
[2,] 2 
[3,] 3 
[4,] 4 
[5,] 5 
[6,] 6 
[7,] 7 
[8,] 8 
R>