Подтвердить что ты не робот

Как изменить размер NumericVector?

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

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

4b9b3361

Ответ 1

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

Наши объекты представляют собой мелкие обертки вокруг объекта R, поэтому push_back on, скажем, 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>