6

Rcpp で「過去へのカップリング」アルゴリズムを実装しようとしています。このために、乱数の行列を保存する必要があります。アルゴリズムが収束しなかった場合は、乱数の新しい行列を作成して、それも保存します。これは、収束するまで 10 回以上実行する必要がある場合があります。

ListR の場合と同じように、 を使用して動的に更新できることを望んでいました。実際には非常に驚きましたが、リストのサイズが大きくなるたびにエラーが発生しました。追加のリスト要素に必要なメモリを割り当てなかったので、これは理にかなっているように見えますが、私は 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 に答える