Суммируйте список матриц [дубликат]


этот вопрос уже есть ответ здесь:

У меня есть список, где каждый элемент матрицы 5*5. Например

[[1]]   
           V1          V2          V3          V4          V5      
      [1,]   0.000000   46.973700   21.453500  338.547000   10.401600 
      [2,]  43.020500    0.000000  130.652000  840.526000   56.363700 
      [3,]  12.605600  173.238000    0.000000  642.075000   19.628100 
      [4,] 217.946000  626.368000  481.329000    0.000000  642.341000 
      [5,] 217.946000  626.368000  481.329000    0.000000  642.341000 
[[2]]   
           V1          V2          V3          V4          V5      
      [1,]   0.000000   47.973700   21.453500  338.547000   10.401600 
      [2,]  143.020500    0.000000  130.652000  840.526000   56.363700 
      [3,]  312.605600  17.238000    0.000000  642.075000   19.628100 
      [4,]  17.946000  126.368000  481.329000    0.000000  642.341000
      [5,] 217.946000  626.368000  481.329000    0.000000  642.341000  
...

Как я могу использовать функцию apply-like для суммирования матрицы [1] в [n] и возвращать матрицу 5*5 в результате (каждый элемент является суммой соответствующие элементы в каждой матрице в списке) ?

4 52

4 ответа:

использовать Reduce.

## dummy data

.list <- list(matrix(1:25, ncol = 5), matrix(1:25, ncol = 5))

Reduce('+', .list)
##       [,1] [,2] [,3] [,4] [,5]
## [1,]    2   12   22   32   42
## [2,]    4   14   24   34   44
## [3,]    6   16   26   36   46
## [4,]    8   18   28   38   48
## [5,]   10   20   30   40   50

Я думаю, что ответ @mnel является более эффективным, но это другой подход:

apply(simplify2array(.list), c(1,2), sum)

    [,1] [,2] [,3] [,4] [,5]
[1,]    2   12   22   32   42
[2,]    4   14   24   34   44
[3,]    6   16   26   36   46
[4,]    8   18   28   38   48
[5,]   10   20   30   40   50

вы могли бы вы do.call с некоторым monkeying вокруг, но он теряет свое красноречие:

.list <- list(matrix(1:25, ncol=5), matrix(1:25,ncol=5), matrix(1:25,ncol=5))

x <- .list[[1]]
lapply(seq_along(.list)[-1], function(i){
    x <<- do.call("+", list(x, .list[[i]]))
})
x

есть еще более простой способ:

matlist <- list(matrix(1:25, ncol=5), matrix(1:25,ncol=5))
combmat <- matlist[[1]]+matlist[[2]]

> combmat
      [,1] [,2] [,3] [,4] [,5]
[1,]    2   12   22   32   42
[2,]    4   14   24   34   44
[3,]    6   16   26   36   46
[4,]    8   18   28   38   48
[5,]   10   20   30   40   50

хотя я думаю, что использование уменьшить это лучший способ пойти.