2016-06-21 4 views
0

私は、線形方程式の系を解くことを望んでいます、AX = B、ここでAは比較的大きな疎かつ正のJxJ行列です。 Bは次元JxSの列ベクトルではなく行列です。上記、しかしmatlabのブロック共役勾配のための前処理器

design=kron(speye(S),A) 
X=pcg(design,B(:)); 

行列designがあまりにも単純であるため、私のために可能ではない。どこへ行く

一つの方法は、標準PCGルーチンがうまくいくように、例えば、この問題を「微調整」することですそのスパース性を利用した後でさえ、大きなものに保存される。よりよい解決策が行列designを格納することなく、PCGを実行することであり、それは

[email protected](x) reshape(A*reshape(x,J,[]),[],1); 
X=pcg(afun,B(:)); 
X=reshape(X,J,S); 

ある今、私は私の質問に取得する:上記の記述されたコードに、前提条件(例えばicholから)を可能にする方法がありますは追加の行列を格納していませんか?

X=pcg(afun,B(:));はいつまでも収束するため、この場合は前提条件が役立つことがあります。

答えて

0

あなたはpcgはすでに前提条件を使用しないことを知っている必要があり、どちらかあなたが本当にicholコンディショナーを使用したい場合は、明示的かどうか、それを与えている間は、明示的にan example in the documentation...

で記述されているものよりも良いオプションがあります

入力引数が1つのみのicholを使用して、不完全を構成します。 ゼロ充填のコレクタキー分解。あなたの行列を1として

L = ichol(A);

[x1,fl1,rr1,it1,rv1] = pcg(A,b,1e-8,100,L,L');

designと呼ばれ、そのどこにもあなたのコード内で見られないことを、私はそれはそれを格納する必要性を解決すると思います。

+0

こんにちはアンダー、ご返信ありがとうございます。私はおそらく十分ではなかったでしょう。私の質問は、行列Lを格納せずに最初に説明したようなブロックの斜めのpcgフレームワークを渡すことができるかどうかです。私は元の投稿を修正したのでうまくいけばそれは明らかです... – kb87

+0

@ kb87あなたがそれを保存しなければなりません。しかし、この関数を 'pcg(A、b、1e-8,100、ichol(A)、ichol(A) ')'と呼びますが、内部で保存されます。 –