2012-12-08 23 views
11

Wie kann ich die Größe in Rcpp a NumericVector ändern?Wie ändert man die Größe eines NumericVectors?

Wenn ich die Funktion push_back dafür verwende, wird das Programm langsamer. Aber es gibt keine .resize() oder .reserve() Funktionen. (Wenn ich bereits eine NumericVector mit der gewünschten Größe haben, ich die Kopie-Konstruktor verwenden, um die richtige Größe der NumericVector zu erhalten. Dies ist in einem solchen Fall viel schneller als Verwendung von push_back)

+0

Wie Dirk erklärt bereitstellen kann, gibt es kaum eine Chance, wir haben 'Reserve'-Methode. Wir könnten eine 'resize' implementieren. –

Antwort

17

Wenn Sie das bevorzugen C++ - Idiome, verwenden Sie std::vector<double> und geben Sie das am Ende zurück, wo es über einen impliziten wrap() in einen R-Vektor konvertiert wird. Sie könnten auch Armadillo oder Eigen Vektoren über RcppArmadillo und RcppEigen verwenden.

Unsere Objekte sind flache Wrapper um die R-Objekt, so push_back auf, sagen wir, ein Rcp::NumericVector braucht immer eine vollständige Kopie. Das ist bekannt und dokumentiert.

Edit: Also für Vollständigkeit, hier ist ein Beispiel RcppArmadillo mit:

// [[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; 
} 

, die wir über

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> 
Verwandte Themen