【问题标题】:Is there an R function for the element-wise summation of the matrices stored as elements in single list object? [duplicate]是否有一个 R 函数用于对存储为单个列表对象中的元素的矩阵进行元素求和? [复制]
【发布时间】:2013-01-03 21:35:23
【问题描述】:

可能重复:
Sum a list of matrices
Add together a list of matrices element-by-element

我有一个 R 列表对象。列表的每个元素都包含 3 x 3 矩阵。 我想按元素对所有矩阵求和。 那就是:

 myList <- list();
 myList[[1]] <- matrix(1:9,3,3)
 myList[[2]] <- matrix((1:9)*10,3,3)

那我要最后的输出输出

myList[[1]]+myList[[2]]

      [,1] [,2] [,3]
 [1,]   11   44   77
 [2,]   22   55   88
 [3,]   33   66   99

当然我可以为这个计算编写一个循环,但是 R 中的循环非常慢。 R中是否有内置函数来处理这项业务?

【问题讨论】:

  • 过早的优化是万恶之源。除非您有证据表明此操作可能是您正在编写的任何程序的性能瓶颈,那么是否循环遍历矩阵是否会产生显着差异?

标签: r


【解决方案1】:

?Reduce

从例子:

## A general-purpose adder:
add <- function(x) Reduce("+", x)

那你就可以了

add(myList)

【讨论】:

  • +1 这个我不记得了,很好的答案!
  • @PaulHiemstra 但是,请看我的时间回答。
【解决方案2】:

或者,您可以将数据放在多维数组而不是列表中,并在上面使用apply

require(abind)
m = abind(matrix(1:9,3,3), matrix((1:9)*10,3,3), along = 3)

产生一个三维数组。然后使用apply:

apply(m, 1:2, sum)

免责声明:我没有测试此代码,因为我现在没有可用的 R。不过,我确实希望您注意这个选项。

【讨论】:

  • +1 表示abind,尽管调用错误。应该改为apply(m, 1:2, sum)
  • 感谢您的更正,我编辑了我的答案。
  • 没错。列表非常适合组织不同类型、类别或大小的数据,但是当您有一堆组织良好的矩阵时,请坚持使用张量(n 秩数据的数学术语)。
【解决方案3】:

对于那些感兴趣的人:

ffoo<-function(jloop){
barlist<-matrix(nr=25,nc=40)
for (jj in 1:jloop) barlist<-barlist+foolist[[jj]]
}

baradd <- function(x) Reduce("+", x)

导致:

Rgames> foo<-matrix(1:1000,25)
Rgames> for (jj in 1:5e5) foolist[[jj]]<-foo
Rgames> system.time(baradd(foolist))
   user  system elapsed 
    1.7     0.0     1.7 

Rgames> system.time(ffoo(1e5))
   user  system elapsed 
    0.3     0.0     0.3

【讨论】:

    【解决方案4】:
    > do.call("+", myList)
         [,1] [,2] [,3]
    [1,]   11   44   77
    [2,]   22   55   88
    [3,]   33   66   99
    

    但它失败了两个以上,这就是我为什么要支持 GSee 的答案。

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多