R为同一个对象分配几个列表元素

时间:2013-02-22 12:58:05

标签: r list for-loop matrix vectorization

我目前有一个循环 - 实际上是循环中的循环,在模拟模型中,随着个体数量的增加而变慢。我已将其中的大部分内容融入其中,并使其变得更快。但是有一部分我将列表的多个元素分配为同一个东西,将一个大循环简化为我想要实现的任务:

new.matrices[[length(new.matrices)+1]]<-old.matrix

对于循环的每次迭代,调用上面的行,并将相同的矩阵对象分配给列表的下一个新元素。

我正在尝试对此进行矢量化 - 如果可能,或者使其比循环或应用语句更快。

到目前为止,我已尝试过以下方面的内容:

indices <- seq(from = length(new.matrices) + 1, to = length(new.matrices) + reps)
new.matrices[indices] <- old.matrix

然而,这会产生以下信息:

Warning message:
In new.effectors[effectorlength] <- matrix :
  number of items to replace is not a multiple of replacement length

它还会尝试将old.matrix的一个值分配给new.matrices的一个元素,如下所示:

[[1]]
[1] 8687

[[2]]
[1] 1

[[3]]
[1] 5486

[[4]]
[1] 0

当所需结果是一个列表元素=一个整个矩阵时,old.matrix

的副本

有没有办法可以在没有循环的情况下对列表元素中的矩阵进行矢量化?对于循环当前如何实现它们,我们正在谈论成千上万的重复,这大大减慢了事情,因此我希望尽可能地将其矢量化。

1 个答案:

答案 0 :(得分:1)

可能你已经解决了问题,无论如何,代码中的问题

new.matrices[indices] <- old.matrix

是由于尝试使用不同的NULL替换某些对象(new.matrices列表中的matrix元素)而导致的。因此Rold.matrix强制转换为向量,并尝试将每个单独的值粘贴到不同的列表元素上(这就是为什么你得到这个结果,以及当reps为4或8时并且old.matrix不是2 x 2矩阵,你也得到warning)。做

new.matrices[indices] <- list(old.matrix)

可行,R会自动复制单个元素列表list(old.matrix)reps”。