【问题标题】:How to create a diagonal matrix with blocks in the diagonal with each block a different matrix? [duplicate]如何创建一个对角线中的块的对角矩阵,每个块都有一个不同的矩阵? [复制]
【发布时间】:2017-07-16 05:16:13
【问题描述】:

我想创建一个块状对角矩阵,如下所示:

M

A1 0  0  0   0
0 A2  0  0   0 
0  0 A3  0   0 
0  0  0 A4   0 
0  0  0  0  A5 

每个 0 是一个零矩阵,每个 A1、A2、A3、A4、A5 矩阵是一个方阵,每个矩阵具有相同的维度,但具有不同的条目。

如果我知道每个矩阵 A1、A2、A3、A4、A5,是否有办法生成如此大的块对角矩阵而不使用循环?

我希望找到一个适用于任意数量矩阵的解决方案,希望不仅仅是 5 个。谢谢!

【问题讨论】:

  • 将矩阵放入list 并执行bdiaglibrary(Matrix); bdiag(mget(paste0('A', 1:5)))
  • 对于所有 As 相同的特殊情况,kronecker(diag(5), matrix(1:9,3,3))

标签: r matrix


【解决方案1】:

将矩阵放入list 后,我们可以使用Matrix 中的bdiag 得到sparseMatrix

library(Matrix)
sM <- bdiag(mget(paste0("A", 1:5)))
sM
# 10 x 10 sparse Matrix of class "dgCMatrix"

# [1,] 1 3 . .  .  .  .  .  .  .
# [2,] 2 4 . .  .  .  .  .  .  .
# [3,] . . 5 7  .  .  .  .  .  .
# [4,] . . 6 8  .  .  .  .  .  .
# [5,] . . . .  9 11  .  .  .  .
# [6,] . . . . 10 12  .  .  .  .
# [7,] . . . .  .  . 13 15  .  .
# [8,] . . . .  .  . 14 16  .  .
# [9,] . . . .  .  .  .  . 17 19
#[10,] . . . .  .  .  .  . 18 20

如果需要,sparseMatrix 可以转换为matrix

as.matrix(sM)

数据

A1 <- matrix(1:4, 2, 2)
A2 <- matrix(5:8, 2, 2)
A3 <- matrix(9:12, 2, 2)
A4 <- matrix(13:16, 2, 2)
A5 <- matrix(17:20, 2, 2)

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 2018-06-12
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    相关资源
    最近更新 更多