【问题标题】:Repeating a block matrix many times in diagonal part of a block matrix, with the off-diagonal blocks all zero matrices?在块矩阵的对角部分重复块矩阵多次,非对角块全部为零矩阵?
【发布时间】:2017-07-13 23:32:38
【问题描述】:

我想创建一个块对角矩阵,其中对角块重复一定次数,非对角块都是零矩阵。例如,假设我们从一个矩阵开始:

> 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

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

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    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) 对角线 或创建"dgTMatrix" 类的稀疏矩阵:

    Diagonal(k) %x% M
    

    【讨论】:

    • 可以用矩阵乘法代替kron吗?有一些A,B st。 ArB = kron(eye(2), r) ?
    猜你喜欢
    • 1970-01-01
    • 2015-05-21
    • 2021-12-22
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多