2016-12-05 22 views
0

を解く私は私が働いている大規模疎行列を持っていますが、示すように簡単にするために、私は以下のことを書かれている:特異疎行列MATLAB

row = [1,3]; 
col = [1,3]; 
val = [22,33]; 

B = sparse(row,col,val,3,3) 

22  0  0 
0  0  0 
0  0 33 

この行列が特異であり、その逆を持っていません私は、次の解のために使うことができます:

[A]=[B][C] =>[B]\[A] = [C]です。

この問題を解決するには、ゼロだけを含む行と列をすべて削除する必要があります。上記の例では、スパース行列を作成する前に2行目と2行目を削除します。

しかし、これを試してみると、行と列ベクトル(3,3)で記述されたインデックスが行列の次元の外側を指し、エラーになります。 この問題を解決するために私ができることは何ですか?

答えて

1

最初anyは疎行列に適用されるので、これは(スペース的に)非常に効率的である、あなたの行列あなたが持っている方法を構築し、次の

C = B(any(B, 2), any(B, 1)); 

で空の行や列を削除することもできますまばらな結果が得られ、インデックス操作は、上記のも、あなたの問題に応じて、これは非特異行列を保証するものではありません、が、スパース

あるC得られます。あなたが行と対応する列の両方がゼロである場合、行または列を削除したい場合は

更新

(保つためにあなたの行列の広場)

tokeep = any(B, 2).' | any(B, 1); 

C = B(tokeep, tokeep); 
+0

大規模なスパース行列(1000000x1000000)を扱う場合、これは非常に非効率的な方法ではありませんか? – Lobstw

+0

@Lobstwすべての中間値も 'sparse'であるため、いいえ – Suever

+0

ありがとうございます。しかし、これは次のような場合に期待される結果をもたらさない: '[22 0 0; 44 0 0; 0 0 33]' 2行目は削除しないでください。 – Lobstw

0

可能な解決策

row = [1,3]; 
col = [1,3]; 
val = [22,33]; 
[ur,~,u_row] = unique(row); 
[uc,~,u_col] = unique(col); 
B =sparse(u_row,u_col,val,numel(ur),numel(uc)); 
関連する問題