2013-02-26 18 views
6

私のmatlabコード内では、特定の与えられた行列のコレスキー分解を扱わなければなりません。私は一般的にchol(A,'lower')に下部三角因子を生成するよう呼びかけています。コレスキー因子分解

私のコードをprofilerで確認すると、特に入力マトリックスのサイズが大きくなると、関数cholは本当に時間がかかります。

したがって、組み込みのchol機能に代わるものがあれば、私は知りたいと思います。

私はLAPACKライブラリを考えていて、つまりspptrfの機能を考えています。それはMATLABで利用可能ですか?

ヒントやサポートは何でも歓迎されています。

EDIT

は一例として、プロファイラは、この情報を取得:Coh_uサイズ(1395*1395)を有する

enter image description here

。また、私は4000異なる構成のためのコレスキー因子が必要であるので、chol4000回と呼ばれることに注意してください。

+4

バックグラウンドMatlabは一般にBLAS、LAPACKなどの既製ライブラリの精度、精度、スピードが同等(広義にはスピーディー)な高品質数値ライブラリを使用しています。ライブラリ。それは可能性が高いですが、 '' chol'の実装でそのようなコードを使用していることを確認していません。私よりも優れたプログラマー(おそらくあなたよりは優れていないかもしれませんが)はMatlabの数値ルーチンの実装を(何らかの形で)より速く実装しようと努力しており、悲惨に失敗しました。 –

+0

私は自分のコードのパフォーマンスを 'fortran'で書かれた' lppack 'spptrf'を使って別のものと比較しています。feelinfは 'spptrf'が' 'chol''よりも格段に速いということですが、あなたはいつも2つの異なる言語で同様のコードを比較する際には慎重である必要があります。 MATLAB内部で 'LAPACK'ライブラリと呼ばれる疑いがありますが、私はあまりよく分かりません。 – fpe

答えて

1

使用しているMATLABのバージョンはわかりませんが、私はthis discussionを見つけました。旧バージョンでは、Cholesky Factorizationの記述が非常に遅いことが示唆されています。

答えの1つは、chol2の機能を持つCHOLMOD package or SuiteSparseを使用すると言われています。

+0

私はMatlabの最新リリースを使用しています。したがって、 'CHOLMOD'は既に実装されているはずです。または私はそう思います! – fpe

0

Coh_uの正しい式は

A)Coh_u = exp(-a.*sqrt((f(ii)/Uhub).^2 + (0.12/Lc).^2)).*(df.*psd(ii,1));

または

下B) Coh_u = exp(-a.*dist*sqrt((f(ii)/Uhub).^2 + (0.12/Lc).^2)).*(df.*psd(ii,1));

の違い)としてであり、b)であることである場合は、確認することができますb)distが追加されており、これは2つの行列の間の距離である。YZ

dist = pdist2([Y(:) Z(:)],[Y(:) Z(:)]); 

しかし、chol()機能では、 "Matrix not positive definite"エラーが発生します。

関連する問題