2012-10-07 11 views
6

完全な上三角系を解きたい場合は、linsolve(A,b,'UT')と呼ぶことができます。ただし、これは現在、疎な行列ではサポートされていません。どうすればこれを克服できますか?あなたは何が必要のでSolve * sparse *上三角系

+1

['full'](http://www.mathworks.com/help/matlab/ref/full.html)を使用しますか? – chaohuang

+4

@chaohuang非常に悪い考えです。彼は理由のために '希薄 'を使用します。 – angainor

+0

私の更新された答えを見てください。 – angainor

答えて

3

編集 ...あなたのスパース行列に関数mldivide(\)またはMRDIVIDE(/)演算子を使用することができます

+2

私は彼が 'A = triu(...)'(完全)vs 'A =まばらな(トゥルー(...))'(疎)を意味すると思います –

+0

@RodyOldenhuisああ、もう一度読んでいます。 。しかし、私の答えはとにかく三角形の解法(後方/前方置換)についての情報を含んでいます - 最後に、あなたは行列を因数分解した後にあなたがすることです:) – angainor

1

は三角形がすることができます、また、前方/後方代入と呼ばれる、手順を解決するためでありますそのため通常のMATLABバックスラッシュ\演算子を使用します。

オリジナルの答えで述べたように
x = U\b 

、MATLABは、あなたの行列が三角形であるという事実を認識します。そのことを確認するには、にあるcs_usolveプロシージャのパフォーマンスを比較できます。 Cで実装されているmex関数で、上三角スパース行列(これにも同様の関数があります:cs_lsolvecs_utsolveおよびcs_ltsolve)のスパースな三角解を計算します。

疎なコレスキー分解では、ネイティブMATLABのperformance comparisoncs_l(t)solveを見ることができます。基本的に、MATLABのパフォーマンスは良好です。あなたは転置システム

x = U'\b 

MATLABは、ことを認識し、明示的にUの転置を作成していないを解決したい場合にのみ落とし穴があります。その場合は、cs_utsolveを明示的に呼び出す必要があります。

オリジナル答えお使いのシステムが対称であるとあなただけcholは対称行列を処理し、(それは私があなたの質問にフルを理解する方法である)、およびコレスキー分解があなたのために適している場合、上三角行列の一部を保存する場合、あなたの行列が正定値ならば。不定行列の場合はldlを使用できます。どちらもスパースストレージを処理し、対称マトリクスパーツを処理します。

新しいmatlabのバージョンはcholmod and suitesparseを使用しています。それは私が知っている最も優れたコレスキー因子分解です。 matlabでは、並列BALSで並列化されています。

あなたは上記の機能から取得率は

A=LL' 

は、あなたが今やらなければならないことが前方に実行されるように、上三角行列Lと簡単で安価である後退代入、です。 MATLABで、これは自動的にTHAバックスラッシュオペレータに

x=L'\(L\b) 

が行われる行列は、疎であることができ、MATLABは、下/上三角であることを認識するであろう。コレスキー因子分解を使用して得られたファクタについても、前方代入と一緒にこのコールを使用します。

4

UTとLTシステムは、解決するのが最も簡単なシステムです。約on the wikiを読んでください。

%# some example data 
A = sparse(triu(rand(100))); 
b = rand(100,1); 

%# solve UT system by back substitution  
x = zeros(size(b)); 
for n = size(A,1):-1:1  
    x(n) = (b(n) - A(n,n+1:end)*x(n+1:end))/A(n,n);  
end 

手順はLTシステムのために非常に似ています。このことを知って、あなた自身のUTやLTソルバを書くのは簡単です。ネイトが既に示されているようにも、スペア行列のために働く

x = A\b 

は、MATLABのバックスラッシュ演算子を使用することが一般的にはるかに簡単かつ高速である、と述べました。

この演算子は、非正方形Aを持つUTシステム、またはAがいくつかの要素が主対角線にゼロ(または< eps)である場合にも解決されることに注意してください。それはあなたに望ましいかもしれないし、そうでないかもしれない最小二乗の意味でこれらのケースを解決します。 (バック)についてもっと読む

if size(A,1)==size(A,2) && all(abs(diag(A)) > eps) 
    x = A\b; 
else 
    %# error, warning, whatever you want 
end 

MATLABコマンドプロンプトで

>> help \ 

または

>> help slash 

を入力して、演算子をスラッシュ:あなたは解決を行う前に、これらの例を確認することができ。

+0

もちろん、私はその逆置換を自分で実装することができます。問題はforループが非常に遅いのでmatlabで一般的に回避されるということです。 スラッシュ演算は、三角行列に対してバック置換を使用することが保証されていますか? – olamundo

+0

@noam:[こちらをご覧ください](http://scicomp.stackexchange.com/questions/1001/how-does-the-matlab-backslash-operator-solve-ax-b-for-square-matrices)。 –

+1

\はバックスラッシュまたは左区切り( 'mldivide')ですが、'/'はスラッシュまたは右区切り(' mrdivide')です。 – angainor