対称正定行列の対角更新


19

Aは対称正定値(SPD)スパース行列です。は、スパース対角行列です。は大きく( > 10000)、の非ゼロの数は通常100〜1000です。G n n Gn×nGnnG

Aはコレスキー形式でとして因数分解されています。LDLT

がときにと効率的に更新する方法は?D A A + GLDAA+G


Gには正の要素しかありませんか?もしそうなら、ここに簡単な上限があります:ランク1更新の合計として対角線更新を表示します。ランク1更新のLDL ^ t分解を計算するO(n ^ 2)メソッドがあります(グーグル検索で例を提供)。その後、対角線の更新はO(rn ^ 2)で実行されます。rはGの非ゼロの対角要素の数です。これらの更新の特定の性質を考えると、いくつかの計算を保存するショートカットがありますが、それが可能かどうかは明確ではありません次数をO(rn ^ 2)以下に減らします。

3
私は同意します-コレスキー分解の対角更新を単に分解を繰り返すよりも速くする方法はないと思いますが、ランク1の更新は時間で行うことができます。対角線上の各非ゼロ。GO(m2)G
ブライアン

10
以下のためと数百には、リファクタリング打つのは難しいだろう。のサイズがはるかに大きくなり、が非常にまばらになった場合、成果が得られる可能性があります。いずれにせよ、可能な更新と近似は、対角線と固定対称線形システムを事前計算後に二次時間で解くことができますか?N N ZG A A Gn104nnz(G)AAG
ジェドブラウン

5
ジェッド、あなたのコメントをここに答えてもらうべきだと思います。
マイケルグラント

回答:


3

CHOLMOD SuiteSparseパッケージの最新バージョン(ベータ4.4.5)は、matlab(およびC)APIを使用して、分解の対称行/列の変更(rank2更新)をサポートします。私は自分のプロジェクトの1つで正常に使用しました。LDLT

これを使用して、分解の更新を行うことができます。この論文に基づいています。nnz(G)

したがって、複雑さはます。ここ使用するときに大幅に低減することができる順列を低減フィルスパースためO(nnz(G)nnz(L))nnz(L)A

パッケージはここからダウンロードできます

以下に、パッケージの所有者からのいくつかのメモを示します(ティムデイビス教授)。

API:

LD = ldlrowmod(LD、k)は、A(:、k)およびA(k、:)をアイデンティティのk番目の行/列に設定することにより、行/列kを削除します。

LD = ldlrowmod(LD、k、C)は、Aのk番目の行/列(IDのk番目の行/列でなければなりません)をスパース列Cに置き換えます。

複雑:

行の追加/削除には最大時間かかるため、が場合、時間は最大です。O(nnz(L))nnz(L)O(n)O(n)

順列を減らす塗りつぶし:

= Aのように、ユーザーの行列を因数分解することはめったにありません。むしろ、が非ゼロを大幅に減らすように =に置き換えます。LDLTLDLTPAPTL

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.