【问题标题】:Merge a list of matrices into a larger matrix将矩阵列表合并为更大的矩阵
【发布时间】:2021-08-23 11:45:09
【问题描述】:

假设我有一个包含 9 个 2 x 2 矩阵的列表,定义如下:

mat_list <- list(matrix(1, 2, 2), matrix(2, 2, 2), matrix(3, 2, 2), 
                 matrix(4, 2, 2), matrix(5, 2, 2), matrix(6, 2, 2), 
                 matrix(7, 2, 2), matrix(8, 2, 2), matrix(9, 2, 2))

我想将这些矩阵合并为一个 6 x 6 矩阵。它看起来像这样:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    4    4    7    7
[2,]    1    1    4    4    7    7
[3,]    2    2    5    5    8    8
[4,]    2    2    5    5    8    8
[5,]    3    3    6    6    9    9
[6,]    3    3    6    6    9    9

我可以使用以下代码完成这项任务:

do.call( cbind, list( do.call( rbind, mat_list[1:3]), 
                      do.call( rbind, mat_list[4:6]),
                      do.call( rbind, mat_list[7:9])) )

但是如何将其推广到非常大的矩阵列表中呢?写出do.call函数列表太乏味了。

【问题讨论】:

    标签: r list matrix


    【解决方案1】:

    也许我们可以这样做

    do.call(
      cbind,
      lapply(
        split(mat_list, ceiling(seq_along(mat_list) / 3)),
        function(x) do.call(rbind, x)
      )
    )
    

    给了

         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    1    1    4    4    7    7
    [2,]    1    1    4    4    7    7
    [3,]    2    2    5    5    8    8
    [4,]    2    2    5    5    8    8
    [5,]    3    3    6    6    9    9
    [6,]    3    3    6    6    9    9
    

    > do.call(cbind, Map(function(x) do.call(rbind, x), data.frame(matrix(mat_list, 3, 3))))
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]    1    1    4    4    7    7
    [2,]    1    1    4    4    7    7
    [3,]    2    2    5    5    8    8
    [4,]    2    2    5    5    8    8
    [5,]    3    3    6    6    9    9
    [6,]    3    3    6    6    9    9
    

    【讨论】:

    • seq do.call(rbind, lapply(seq(ceiling(length(mat_list) / 3)), function(i) do.call(cbind, mat_list[seq(i, length(mat_list), by = 3)])))的类似选项
    • 谢谢@ThomasIsCoding 这很好用。这两种方法对于大量矩阵(>1000)是否有效?还是一个比另一个快?
    • @akrun 感谢您提供另一种选择!
    • @hahsan1 我猜第一个应该更快,但你可以测试一下。
    猜你喜欢
    • 2023-03-09
    • 2017-05-03
    • 1970-01-01
    • 2018-05-03
    • 2017-08-21
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    相关资源
    最近更新 更多