如何调整 NumericVector 的大小?

14
我怎样在Rcpp中调整NumericVector的大小?
当我使用 push_back 函数时,程序会变慢。但是没有 .resize() 或者 .reserve()函数。(如果我已经有了一个指定大小的NumericVector,可以使用复制构造函数来获得正确大小的NumericVector。在这种情况下,这比使用push_back要快得多。)

正如Dirk所解释的那样,我们很少有机会拥有一个“reserve”方法。我们可能会实现一个“resize”。 - Romain Francois
1个回答

19
如果你喜欢 C++ 习惯用法,可以使用 std::vector<double> 并在结尾处返回它。最终会通过隐式的 wrap() 转换为 R 向量。你也可以通过 RcppArmadillo 和 RcppEigen 使用 Armadillo 或 Eigen 向量。
我们的对象是 R 对象的浅层包装,所以对于一个 Rcp::NumericVectorpush_back 操作总是需要进行完整的复制。这一点是已知并记录在文档中的。 编辑: 为了完整起见,这里提供一个使用 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> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接