将一个矩阵列表合并成一个大矩阵

3
假设我有一个由九个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函数列表将会太过繁琐。

1个回答

2
也许我们可以这样做。
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

2
或者使用类似的选项 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)]))) - akrun
谢谢@ThomasIsCoding,这个很好用。这两种方法对于一个大的矩阵列表(>1000)来说都是高效的吗?还是其中一种比另一种更快? - hahsan1
1
@akrun感谢您提供另一种选择! - ThomasIsCoding
@hahsan1 我猜第一个应该会更快,但你可以测试一下。 - ThomasIsCoding

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接