我有一个现有的块对角协方差矩阵,我想以块结构易于可见的方式对它进行排序(一些函数,如 blockdiag 自动执行此操作,但我继承了一个不这样做的过程)。也就是说,现在我的行和列不按各个块的顺序排列。
我有2组:
第 1 组:“a”、“b”
第 2 组:“c”、“d”
我想要的是这样的:
a b c d
a 1 3 0 0
b 9 11 0 0
c 0 0 6 8
d 0 0 14 16
看看
seriation
包装。
从块对角矩阵开始:
m <- diag(1:5) %x% matrix(1, 2, 2)
m
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#> [1,] 1 1 0 0 0 0 0 0 0 0
#> [2,] 1 1 0 0 0 0 0 0 0 0
#> [3,] 0 0 2 2 0 0 0 0 0 0
#> [4,] 0 0 2 2 0 0 0 0 0 0
#> [5,] 0 0 0 0 3 3 0 0 0 0
#> [6,] 0 0 0 0 3 3 0 0 0 0
#> [7,] 0 0 0 0 0 0 4 4 0 0
#> [8,] 0 0 0 0 0 0 4 4 0 0
#> [9,] 0 0 0 0 0 0 0 0 5 5
#> [10,] 0 0 0 0 0 0 0 0 5 5
随机播放:
mm <- m[sample(1:10), sample(1:10)]
mm
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#> [1,] 0 0 0 0 2 0 0 0 0 2
#> [2,] 0 0 0 0 0 5 5 0 0 0
#> [3,] 0 3 3 0 0 0 0 0 0 0
#> [4,] 0 0 0 0 2 0 0 0 0 2
#> [5,] 0 0 0 4 0 0 0 0 4 0
#> [6,] 0 0 0 4 0 0 0 0 4 0
#> [7,] 0 0 0 0 0 5 5 0 0 0
#> [8,] 1 0 0 0 0 0 0 1 0 0
#> [9,] 0 3 3 0 0 0 0 0 0 0
#> [10,] 1 0 0 0 0 0 0 1 0 0
对打乱后的矩阵进行序列化:
ser <- seriation::seriate(mm)
mm[ser[[1]], ser[[2]]]
#> [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#> [1,] 5 5 0 0 0 0 0 0 0 0
#> [2,] 5 5 0 0 0 0 0 0 0 0
#> [3,] 0 0 1 1 0 0 0 0 0 0
#> [4,] 0 0 1 1 0 0 0 0 0 0
#> [5,] 0 0 0 0 2 2 0 0 0 0
#> [6,] 0 0 0 0 2 2 0 0 0 0
#> [7,] 0 0 0 0 0 0 3 3 0 0
#> [8,] 0 0 0 0 0 0 3 3 0 0
#> [9,] 0 0 0 0 0 0 0 0 4 4
#> [10,] 0 0 0 0 0 0 0 0 4 4