首页 文章

在块矩阵的对角线部分多次重复块矩阵,非对角线块全部为零矩阵?

提问于
浏览
3

我想创建一个块对角矩阵,对角线块重复一定次数,非对角线块都是零矩阵 . 例如,假设我们从具有以下内容的矩阵开始:

> diag.matrix

       [,1] [,2] [,3] [,4] [,5]
  [1,]  1.0  0.5  0.5  0.5  0.5
  [2,]  0.5  1.0  0.5  0.5  0.5
  [3,]  0.5  0.5  1.0  0.5  0.5
  [4,]  0.5  0.5  0.5  1.0  0.5
  [5,]  0.5  0.5  0.5  0.5  1.0

我希望这个矩阵是对角块矩阵,所以最后我有类似的东西:

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]  1.0  0.5  0.5  0.5  0.5  0.0  0.0  0.0  0.0   0.0
 [2,]  0.5  1.0  0.5  0.5  0.5  0.0  0.0  0.0  0.0   0.0
 [3,]  0.5  0.5  1.0  0.5  0.5  0.0  0.0  0.0  0.0   0.0
 [4,]  0.5  0.5  0.5  1.0  0.5  0.0  0.0  0.0  0.0   0.0
 [5,]  0.5  0.5  0.5  0.5  1.0  0.0  0.0  0.0  0.0   0.0
 [6,]  0.0  0.0  0.0  0.0  0.0  1.0  0.5  0.5  0.5   0.5
 [7,]  0.0  0.0  0.0  0.0  0.0  0.5  1.0  0.5  0.5   0.5
 [8,]  0.0  0.0  0.0  0.0  0.0  0.5  0.5  1.0  0.5   0.5
 [9,]  0.0  0.0  0.0  0.0  0.0  0.5  0.5  0.5  1.0   0.5
[10,]  0.0  0.0  0.0  0.0  0.0  0.5  0.5  0.5  0.5   1.0

在这里,我们在块对角线上重复两次相同的块矩阵 . 如果我想有效地执行任意次数,有没有办法做到这一点?谢谢!

1 回答

  • 8

    1) kronecker 如果 M 是您的矩阵, k 是您希望它重复的次数,那么:

    kronecker(diag(k), M)
    

    例如,

    M <- matrix(0.5, 5, 5) + diag(0.5, 5)
    k <- 2
    kronecker(diag(k), M)
    

    赠送:

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
     [1,]  1.0  0.5  0.5  0.5  0.5  0.0  0.0  0.0  0.0   0.0
     [2,]  0.5  1.0  0.5  0.5  0.5  0.0  0.0  0.0  0.0   0.0
     [3,]  0.5  0.5  1.0  0.5  0.5  0.0  0.0  0.0  0.0   0.0
     [4,]  0.5  0.5  0.5  1.0  0.5  0.0  0.0  0.0  0.0   0.0
     [5,]  0.5  0.5  0.5  0.5  1.0  0.0  0.0  0.0  0.0   0.0
     [6,]  0.0  0.0  0.0  0.0  0.0  1.0  0.5  0.5  0.5   0.5
     [7,]  0.0  0.0  0.0  0.0  0.0  0.5  1.0  0.5  0.5   0.5
     [8,]  0.0  0.0  0.0  0.0  0.0  0.5  0.5  1.0  0.5   0.5
     [9,]  0.0  0.0  0.0  0.0  0.0  0.5  0.5  0.5  1.0   0.5
    [10,]  0.0  0.0  0.0  0.0  0.0  0.5  0.5  0.5  0.5   1.0
    

    1a) %x% 最后一行代码可以写成:

    diag(k) %x% M
    

    2) Matrix::bdiag 如果要节省空间,另一种可能性是创建类 "dgMCatrix" 的稀疏矩阵 . 它不存储零值 . 见 ?bdiag

    library(Matrix)
    
    bdiag(replicate(k, M, simplify = FALSE))
    

    赠送:

    10 x 10 sparse Matrix of class "dgCMatrix"
    
     [1,] 1.0 0.5 0.5 0.5 0.5 .   .   .   .   .  
     [2,] 0.5 1.0 0.5 0.5 0.5 .   .   .   .   .  
     [3,] 0.5 0.5 1.0 0.5 0.5 .   .   .   .   .  
     [4,] 0.5 0.5 0.5 1.0 0.5 .   .   .   .   .  
     [5,] 0.5 0.5 0.5 0.5 1.0 .   .   .   .   .  
     [6,] .   .   .   .   .   1.0 0.5 0.5 0.5 0.5
     [7,] .   .   .   .   .   0.5 1.0 0.5 0.5 0.5
     [8,] .   .   .   .   .   0.5 0.5 1.0 0.5 0.5
     [9,] .   .   .   .   .   0.5 0.5 0.5 1.0 0.5
    [10,] .   .   .   .   .   0.5 0.5 0.5 0.5 1.0
    

    2b) Diagonal 或创建类 "dgTMatrix" 的稀疏矩阵:

    Diagonal(k) %x% M
    

相关问题