2012年7月25日水曜日

順列のバグが取れた

いろいろと調べた結果、順列についてのバグは取れた。
CHOLMOD の場合、順列についてのどう対応しているかがマニュアルなどに説明がないので、ここに書いておくことにする。

A x = b を解く場合、
matlab なら
[pp] = amd(A);
[dummy1, post] = etree(A);
pp = pp(post);
P = eye(n);
P = P(pp,:);
として順列 pp とそれに対応する行列 P が作れる。
この pp に対応するのが、CHOLMOD の cholmod_factor に入っている Perm である。

Ax = b については、
PAP^T = LL^T
となるようにコレスキー分解が入るので、
x = P^T*L^{-T}*L^{-1}*P*b
のように行われる。

したがって、CHOLMOD で Ax = b を解くには、

cholmod_dense* b2 = cholmod_solve(CHOLMOD_P, L, b, common);
cholmod_dense* b3 = cholmod_solve(CHOLMOD_LDLt, L, b2, common);
cholmod_dense* x = cholmod_solve(CHOLMOD_Pt, L, b3, common);
のようにして解くことになる。
(ここの CHOLMOD_P, CHOLMOD_Pt を書けるところが CHOLMOD のデモプログラムには明記されていない)

今日の作業内容:SDPA-C 4h
今日のランチ:やぶ A定食マグロの味噌焼き
明日の予測作業時間:4h


0 件のコメント:

コメントを投稿