5

我目前有一个循环——实际上是一个循环中的循环,在一个模拟模型中,随着人数的增加,它会变慢。我已经对大部分内容进行了矢量化处理,并且速度快了很多。但是有一部分我将列表的多个元素分配为同一件事,将一个大循环简化为我想要实现的任务:

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

有没有一种方法可以矢量化在列表元素中粘贴矩阵而不循环?使用循环当前的实现方式,我们正在谈论数千次重复,这大大减慢了速度,因此我希望尽可能将其矢量化。

4

1 回答 1

2

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

new.matrices[indices] <- old.matrix

是由于试图用不同的东西替换一些对象(列表NULL中的元素new.matrices)引起的,a matrix. 所以R强制old.matrix转换成一个向量并尝试将每个单个值粘贴到不同的列表元素,(这就是你得到这个结果的原因,当,比如说,reps是 4 或 8 并且old.matrix不是 2 x 2 矩阵时,你也会得到warning)。正在做

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

将起作用,并将R自动复制单个元素列表list(old.matrix)reps”次。

于 2013-04-17T13:22:06.073 回答