给出一个稀疏矩阵,如何通过行和列的排列来重新排列行和列,使其成为块对角线状?
行和列排列不一定像反向Cuthill-McKee排序那样耦合:http://www.mathworks.com/help/matlab/ref/symrcm.html?refresh=true简而言之,您可以独立地执行任何行或列排列。
总体目标是将所有非零元素向对角线方向聚类。
这里有一种方法。
首先做一个顶点是行和列的图。每一个非零值都是行和列之间的一条边。
然后,您可以使用标准图论算法来检测此图的连通组件。单个元素表示所有零行和零列。给其他人编号。这些组件的行数和列数可能不相等。您可以将一些零行和零列分配给它们,使它们成为正方形。
您的正方形组件将是您的块,从那些组件的编号,您知道什么顺序放他们。现在只要重新排列行和列的顺序就可以实现这个结构,瞧!(其余的零行/零列将在对角线的右下端产生一组0块。)
只是一个想法,但是如果您从包含
A = [B 0 0; 0 0 C; 0 D 0]; % with matrices 0 (zero elements), B,C and D
Ab = [1 0 0; 0 0 2; 0 3 0]; % with identifiers 1, 2 and 3 (1-->B, 2-->C, 3-->D)
那么
p = symrcm(Ab);
Abperm = Ab(p,p);
然后使用标识符从
您需要巧妙地将标识符分配给各个块等等,但这应该是可能的。