6

我正在尝试在 Rcpp 中实现“与过去的耦合”算法。为此,我需要存储一个随机数矩阵,如果算法没有收敛,则创建一个新的随机数矩阵并存储它。这可能必须完成 10 次以上,直到收敛。

我希望我可以使用 aList并动态更新它,就像我在 R 中所做的那样。实际上我很惊讶它有点工作,但是每当列表大小变大时我都会出错。这似乎是有道理的,因为我没有为其他列表元素分配所需的内存,尽管我对 C++ 不太熟悉,也不确定这是否是问题所在。

这是我尝试过的一个例子。但是请注意,这可能会使您的 R 会话崩溃

library("Rcpp")

cppFunction(
includes = ' 
NumericMatrix RandMat(int nrow, int ncol)
 {
  int N = nrow * ncol;
  NumericMatrix Res(nrow,ncol);
  NumericVector Rands  = runif(N);
   for (int i = 0; i < N; i++) 
  {
    Res[i] = Rands[i];
  }
  return(Res);
 }',

code = '
void foo()
{
  // This is the relevant part, I create a list then update it and print the results:
  List x;
  for (int i=0; i<10; i++)  
  {
   x[i] = RandMat(100,10);
   Rf_PrintValue(wrap(x[i]));
  }
}
')


foo()

有谁知道在不使 R 崩溃的情况下做到这一点的方法?我想我可以在这里以固定数量的元素启动列表,但在我的应用程序中,元素的数量是随机的。

4

1 回答 1

7

您必须为您的列表“分配”足够的空间。也许你可以使用类似resize函数的东西:

List resize( const List& x, int n ){
    int oldsize = x.size() ;
    List y(n) ;
    for( int i=0; i<oldsize; i++) y[i] = x[i] ;
    return y ;
}

每当您希望您的列表比现在更大时,您可以执行以下操作:

x = resize( x, n ) ;

您的初始列表大小为 0,因此预计您在循环的第一次迭代中会出现不可预知的行为。

于 2013-08-01T11:41:50.320 回答