在Rcpp中分配NumericVectors的大型2D数组

时间:2014-08-18 06:47:00

标签: c++ r rcpp

我正在尝试分配NumericVectors的一个大型(ish)2D数组(总内存应该只有大约16Mb,但是我得到了堆栈溢出)。这是我能想出的最小的可重复的例子:

require(Rcpp)
require(inline)
testfun = cxxfunction(
    signature(x="list"),
    body='using namespace std;
        vector<vector<NumericVector> > rs=as< vector<vector<NumericVector> > >( x );
        return wrap(rs);',
    plugin="Rcpp")
x=lapply(1:1000,function(g) lapply(1:1000, function(h) runif(3)))
testfun(x)

使用gdb进行性能分析只能告诉我我在libR.so递归方面非常深入。请注意,虽然这里的数组是矩形的,所以我可以使用NumericMatrix代替我的实际问题,它们将是锯齿状的。谢谢你的任何想法。

1 个答案:

答案 0 :(得分:2)

编辑:使用(相当新的)ListOf<T>模板类的解决方案:

require(Rcpp)
require(inline)
testfun = cxxfunction(
  signature(x="list"),
  body='using namespace std;
        ListOf<ListOf<NumericVector> > rs=as< ListOf<ListOf<NumericVector> > >( x );
        return wrap(rs);',
  plugin="Rcpp")
x=lapply(1:1000,function(g) lapply(1:1000, function(h) runif(3)))
testfun(x)

我们只是将std::vector的所有来电替换为Rcpp::ListOf,而且有点神奇地说,它有效。最重要的是 - 这里不复制数据(假设x确实是一个数字向量列表)。