矩阵重新排序以阻止对角线形式

时间:2016-04-22 18:17:18

标签: algorithm matlab matrix linear-algebra graph-algorithm

给出一个稀疏矩阵,如何通过行和列排列对行和列进行重新排序,使其像块状对角一样?

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

总体目标是将所有非零元素聚集到对角线。

2 个答案:

答案 0 :(得分:2)

这是一种方法。

首先制作一个顶点为行和列的图形。每个非零值都是该行与该列之间的边缘。

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

您的方块组件将成为您的块,从这些组件的编号中您知道将它们放入的顺序。现在只需重新排序行和列以实现此结构,瞧! (剩余的零行/列将在对角线的右下角产生一堆0个块。)

答案 1 :(得分:0)

只是一个想法,但是如果你从包含Ab的块稀疏结构的原始块矩阵A中创建一个新矩阵A。 E.g:

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)

然后Ab是一个简单的稀疏矩阵(示例中大小为3x3)。然后,您可以使用反向Cuthill-McKee排序来获得所需的排列,并将这些排列应用于Ab。

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

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

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