gpt4 book ai didi

r - 动态增加 Rcpp 中列表的大小

转载 作者:行者123 更新时间:2023-12-04 18:44:08 24 4
gpt4 key购买 nike

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

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

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

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 崩溃的情况下做到这一点?我想我可以在这里以固定数量的元素启动列表,但在我的应用程序中,元素的数量是随机的。

最佳答案

您必须为您的列表“分配”足够的空间。也许你可以使用类似 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,因此预计您在循环的第一次迭代中会出现不可预测的行为。

关于r - 动态增加 Rcpp 中列表的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17991083/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com