提问者:小点点

矩阵重排序为块对角形式


给出一个稀疏矩阵,如何通过行和列的排列来重新排列行和列,使其成为块对角线状?

行和列排列不一定像反向Cuthill-McKee排序那样耦合:http://www.mathworks.com/help/matlab/ref/symrcm.html?refresh=true简而言之,您可以独立地执行任何行或列排列。

总体目标是将所有非零元素向对角线方向聚类。


共2个答案

匿名用户

这里有一种方法。

首先做一个顶点是行和列的图。每一个非零值都是行和列之间的一条边。

然后,您可以使用标准图论算法来检测此图的连通组件。单个元素表示所有零行和零列。给其他人编号。这些组件的行数和列数可能不相等。您可以将一些零行和零列分配给它们,使它们成为正方形。

您的正方形组件将是您的块,从那些组件的编号,您知道什么顺序放他们。现在只要重新排列行和列的顺序就可以实现这个结构,瞧!(其余的零行/零列将在对角线的右下端产生一组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)

那么就是一个简单的稀疏矩阵(在本例中大小为3x3)。然后你可以使用反向Cuthill-McKee排序,得到你想要的置换,并将这些置换应用到AB上。

p = symrcm(Ab);
Abperm = Ab(p,p);

然后使用标识符从创建有序块矩阵,我相信您将得到所需的结果。

您需要巧妙地将标识符分配给各个块等等,但这应该是可能的。