Как изменить размер числового вектора?

Как я могу изменить размер в Rcpp a NumericVector?

Когда я использую для этого функцию push_back, программа тормозит. Но нет функций .resize() или .reserve(). (Когда у меня уже есть NumericVector нужного размера, я могу использовать конструктор копирования, чтобы получить правильный размер NumericVector. В таком случае это намного быстрее, чем использование push_back)


person Flowerfairy    schedule 08.12.2012    source источник
comment
Как объяснил Дирк, очень мало шансов, что у нас будет метод reserve. Мы могли бы реализовать resize.   -  person Romain Francois    schedule 10.12.2012


Ответы (1)


Если вы предпочитаете идиомы C++, используйте std::vector<double> и верните его в конце, где он будет преобразован с помощью неявного wrap() в вектор R. Вы также можете использовать векторы Armadillo или Eigen через RcppArmadillo и RcppEigen.

Наши объекты представляют собой неглубокие оболочки вокруг объекта R, поэтому push_back, скажем, на Rcp::NumericVector всегда нужна полная копия. Это известно и задокументировано.

Редактировать: Итак, для полноты картины, вот пример использования 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;
}

который мы можем развернуть через

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> 
person Dirk Eddelbuettel    schedule 08.12.2012