计算矩阵列表

时间:2018-02-13 12:12:18

标签: r matrix

我有一个矩阵列表,例如list(M1,M2,M3,M4)

我想获得一个矩阵,其中添加所有矩阵M1+M2+M3+M4并将每行除以rowSums(M1)+rowSums(M2)+rowSums(M3)+rowSums(M4)

这是一个示例列表,

lst <- list(M1 = matrix(c(1,4,2,5), 2, 2), M2 = matrix(c(2,6,3,7), 2, 2))
lst
#> $M1
#>      [,1] [,2]
#> [1,]    1    2
#> [2,]    4    5
#> 
#> $M2
#>      [,1] [,2]
#> [1,]    2    3
#> [2,]    6    7

我想要的结果是什么,

(1+2)/((2+1)+(2+3)) = 0.375      (2+3)/((2+1)+(2+3)) = 0.625
(4+6)/((6+7)+(4+5)) = 0.4545455  (5+7)/((6+7)+(4+5)) = 0.5454545

2 个答案:

答案 0 :(得分:5)

我们可以尝试

Reduce(`+`, lst)/ sum(sapply(lst, rowSums))

Reduce(`+`, lst)/ sum(unlist(lst))

更新

基于OP的更新(使用OP的数据集)

Reduce(`+`, lst)/rowSums(sapply(lst, rowSums))
#          [,1]      [,2]
#[1,] 0.3750000 0.6250000
#[2,] 0.4545455 0.5454545

数据

lst <- list(matrix(1:16, 4, 4), matrix(1:16, 4, 4))

答案 1 :(得分:3)

您可以使用三维数组和apply()

M1 <- matrix(c(1,4,2,5), 2)
M2 <- matrix(c(2,6,3,7), 2)
L <- list(M1, M2)
M <- array(unlist(L), dim=c(2,2,2)) # or: M <- array(c(M1, M2), dim=c(2,2,2))

apply(M, 1:2, sum) / apply(M, 1, sum)
# > apply(M, 1:2, sum) / apply(M, 1, sum)
#           [,1]      [,2]
# [1,] 0.3750000 0.6250000
# [2,] 0.4545455 0.5454545

和rowSums表示法(thx到user20650):

rowSums(M, dims=2) / rowSums(M)