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

时间:2017-07-13 23:32:39

标签: r matrix

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

> 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 个答案:

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

Diagonal(k) %x% M