给定一个稀疏矩阵,如何通过行列置换将行和列重新排序,使其成为 block 状对角线形式?
行和列排列不一定像反向 Cuthill-McKee 排序那样耦合: http://www.mathworks.com/help/matlab/ref/symrcm.html?refresh=true简而言之,您可以独立执行任何行或列排列。
总体目标是将所有非零元素向对角线聚集。
最佳答案
这是一种方法。
首先做一个图,其顶点是行和列。每个非零值都是该行和该列之间的边。
然后您可以使用标准图论算法来检测此图的连通分量。单个元素代表所有零行和零列。给其他人编号。这些组件的行数和列数可能不相等。您可以给它们分配一些零行和零列,使它们呈正方形。
您的方形组件将成为您的 block ,根据这些组件的编号,您知道将它们放入的顺序。现在只需重新排列行和列即可实现此结构,瞧! (剩余的零行/列将在对角线的右下方产生一堆 0 block 。)
关于algorithm - 矩阵重新排序以阻止对角线形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36800771/