11

可能重复:
对矩阵列表求和 将矩阵
列表逐个元素相加

我有一个 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 中是否有内置函数来完成这项业务?

4

4 回答 4

23

?Reduce

从例子:

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

那么你就可以

add(myList)
于 2013-01-03T21:37:46.057 回答
6

或者,您可以将数据放在多维数组而不是列表中,然后使用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。但是,我确实希望您了解此选项。

于 2013-01-03T21:44:12.000 回答
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
于 2013-01-04T14:35:14.800 回答
2
> do.call("+", myList)
     [,1] [,2] [,3]
[1,]   11   44   77
[2,]   22   55   88
[3,]   33   66   99

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

于 2013-01-03T21:53:20.117 回答