2016-04-22 13 views
2

がどのように行と列の順列を介してブロック形のような対角になるように行と列を並べ替えるために、スパース行列を与えるブロックしますか?マトリックスリオーダリングは、対角線形

行と列の置換は、必ずしも逆Cuthill-McKeeでの並べ替えのように結合されていない。要するに http://www.mathworks.com/help/matlab/ref/symrcm.html?refresh=trueは、独立して、任意の行または列置換を行うことができます。

全体的な目標は、すべての非ゼロ要素を対角線に向かってクラスタリングすることです。

+0

技術的には、任意のマトリックスは、それは、単に1つのブロックの場合でも、ブロック対角状です。あなたは何をしたいですか?ブロック・パーミュテーションを実行する理由とその根底にある問題に明確な例を挙げることができますか? – tvo

+0

@tvo目標は可能な限り多くの独立したブロックであることは明らかです。 – btilly

+1

@btilly Dennisがゴールを追加する前にコメントをしました。さらに、それを仮定することを常に頼む方が良いです。 – tvo

答えて

0

考え方ですが、元のブロックマトリックスAから新しいマトリックスAbを作成して、ブロックのスパース性構造がAの場合は、例えば:

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は単純疎行列(この例ではサイズ3×3)です。その後、逆Cuthill-McKeeの順序を使用して、必要な並べ替えを取得し、これらの順列をAbに適用することができます。

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

その後Abpermから注文したブロック行列Apermを作成するための識別子を使用して、望ましい結果があるでしょう、私は信じています。

あなたは、個々のブロックなどに識別子を割り当てるで巧妙である必要がありますが、これは可能なはずです。

1

ここに1つのアプローチがあります。

まず、頂点が行と列であるグラフを作成します。すべての非ゼロ値は、その行とその列の間のエッジです。

あなたは、このグラフの連結成分を検出するための標準的なグラフ理論のアルゴリズムを使用することができます。単一の要素はすべてゼロの行と列を表します。他に番号を付けます。これらのコンポーネントには、行数と列数が異なる可能性があります。いくつかの行と列をゼロに分配して正方形にすることができます。

スクエアのコンポーネントは、あなたのブロックとなり、それらのコンポーネントの番号から、あなたはそれらを置くためにどのような順序を知っている。今、ちょうどこのような構造を実現するために、行と列の順序を変更して、出来上がり! (残りのゼロの行/列が対角線の右下の0ブロックの束をもたらすであろう。)

関連する問題