matlab – 如何在相关矩阵中移动靠近矩阵对角线的较大值

我有一个五元素的相关矩阵X(C1,C2,C3,C4,C5)

      C1    C2    C3     C4   C5  

 C1    *     1     0     1     0
 C2    1     *     0     0     1
 C3    0     0     *     1     1
 C4    1     0     1     *     0
 C5    0     1     1     0     *

我想使用MatLab移动尽可能多的非零单元靠近对角线,同时保持对角线单元格为“*”.

例如,您可能会注意到列和行在以下矩阵中移位,而对角线单元格为“*”.

      C1    C4    C2     C5   C3  

 C1    *     1     1     0     0
 C4    1     *     0     0     1
 C2    1     0     *     1     0
 C5    0     0     1     *     1
 C3    0     1     0     1     *

因为我想进行聚类,所以我希望在移位后尽可能多的非零单元接近对角线.这是一个NP难题.

有谁知道MatLab中的哪些功能可以实现这一点?

最佳答案
您正在寻找的可能是reverse Cuthill-McKee algorithm (RCM),它几乎可以满足您的需求:对于给定的矩阵,它会找到一个排列,它往往使其非零元素更接近对角线.在MATLAB中有一个内置函数symrcm就可以做到这一点.

因此,假设X是您的矩阵,您可以执行以下操作:

p = symrcm(X);
Xnew = X(p, p);

Xnew是新的重新排序矩阵,p是新的行/列顺序.

让我们先创建一个矩阵:

X = [10 0 0 7 0; 3 20 0 0 11; 0 0 30 0 29; 12 7 0 40 0; 0 33 0 0 50]

现在让我们重新排序:

p = symrcm(X);
Xnew = X(p, p)

结果是:

Xnew =    
    40    12     7     0     0
     7    10     0     0     0
     0     3    20    11     0
     0     0    33    50     0
     0     0     0    29    30

似乎是对的.

转载注明原文:matlab – 如何在相关矩阵中移动靠近矩阵对角线的较大值 - 代码日志