【问题标题】:R assign several list elements the same objectR将几个列表元素分配给同一个对象
【发布时间】:2013-02-08 02:36:35
【问题描述】:

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

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 的副本

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

【问题讨论】:

  • new.matrices[indices] &lt;- rep(list(old.matrix), length(indices))
  • 我敢打赌,有一种更好的方法可以为您计划生产的任何东西构建存储对象。稍后你打算用一些计算矩阵替换每个new.matrices[[k]] 吗? (存储 N 个相同数据的副本似乎没有多大意义)如果是这样,则无需预先创建每个列表条目。下一个问题:你真的需要一个列表,还是一个三阶数组 allmatrices[i,j,k] ,每一层都是 oldmatrix 就足够了?
  • 矩阵是 2 in row 和 n in col,并存储有关个人基因的信息。这里发生的是通过孢子进行的无性繁殖。列数取决于基因的数量——基因可以被复制或删除。由于各种突变过程,new.matrices 中的每一个都将在此之后发生变化。因此,对于 old.matrix[[1]] - 假设它产生 20 个后代,它会被放入 new.matrix 20 次,然后再受制于执行突变过程的函数。出于结果目的,每个模拟周期也会将此列表复制到结果列表中。
  • 层必须具有相同的大小是正确的,但您确实说过将相同的矩阵放入每个层。除非您的基因处理会改变矩阵的大小,否则这无关紧要。
  • 其中一个过程是基因的删除或复制,这最终会改变单个矩阵中的列数。

标签: r list for-loop matrix vectorization


【解决方案1】:

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

new.matrices[indices] <- old.matrix

是由于尝试将某些对象(new.matrices 列表中的 NULL 元素)替换为不同的对象,matrix。所以Rold.matrix 强制转换为一个向量并尝试将每个单个值粘贴到不同的列表元素,(这就是你得到这个结果的原因,当reps 是4 或8 而old.matrix 不是2 x 2 矩阵,您还可以得到warning)。正在做

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

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

【讨论】:

    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2020-06-09
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多