【问题标题】:Calculation on a list of matrix矩阵列表的计算
【发布时间】:2018-02-13 21:56:28
【问题描述】:

我有一个矩阵列表,例如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

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    我们可以试试

    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))
    

    【讨论】:

    • 我曾经问过这个问题,但我还有一个问题是:如果我想获取列表中的每个 3 矩阵并执行相同的操作,假设我有 lisft =(M1,M2,M3,M4,M5,M6,M7,M8,M9) 所以我想对 (M1,M2,M3) 做同样的计算,然后 (M4,M5,M6),然后 (M7, M8,M9).谢谢
    • @Maha 请作为新问题发帖
    【解决方案2】:

    您可以使用 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 表示法(感谢 user20650):

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

    【讨论】:

    • 我曾经问过这个问题,但我还有一个问题是:如果我想获取列表中的每个 3 矩阵并执行相同的操作,假设我有 lisft =(M1,M2,M3,M4,M5,M6,M7,M8,M9) 所以我想对 (M1,M2,M3) 做同样的计算,然后 (M4,M5,M6),然后 (M7, M8,M9).谢谢
    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 2013-05-12
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多