2つの正方行列AとBがあります。Aは対称、Bは対称正定値です。$ trace(AB ^ {-1})$を計算したいと思います。今のところ、Bのコレスキー分解を計算し、方程式$ A = CB $でCを解き、対角要素を合計します。
より効率的な進め方はありますか?
Eigenを使う予定です。行列がスパースである場合(Aは多くの場合対角であり、Bは多くの場合バンド対角である)、実装を提供できますか?
2つの正方行列AとBがあります。Aは対称、Bは対称正定値です。$ trace(AB ^ {-1})$を計算したいと思います。今のところ、Bのコレスキー分解を計算し、方程式$ A = CB $でCを解き、対角要素を合計します。
より効率的な進め方はありますか?
Eigenを使う予定です。行列がスパースである場合(Aは多くの場合対角であり、Bは多くの場合バンド対角である)、実装を提供できますか?
がスパースの場合、で解くのB
が効率的である可能性があります(つまり、O(n)、条件数が良好であると仮定)。B
x_i
B x_i = a_i
(サンプルの共役勾配コードはウィキペディアにあります)。a_i
の列ベクトルをとると、O(n ^ 2)A
の行列が得られます。B^{-1} A
次に、対角要素を合計してトレースを取得できます。一般に、固有値の完全なセットを取得するよりも、このスパース逆乗算を実行する方が簡単です。比較のために、コレスキー分解はO(n ^ 3)です。(コレスキーに関する以下のDarren Engwirdaのコメントを参照してください)。
トレースの近似のみが必要な場合は、平均化することで実際にコストをO(qn)に削減できます。
r^T (A B^{-1}) r
q
ランダムベクトル上r
。通常はq << n
。これは、ランダムベクトルの成分がr
満たす場合の偏りのない推定です。
< r_i r_j > = \delta_{ij}
ここで、< ... >
はの分布の平均を示しますr
。たとえば、コンポーネントr_i
は、単位分散で分散された独立したガウス分布である可能性があります。または、+-1から均一に選択することもできます。通常、トレースはO(n)のようにスケーリングされ、トレース推定の誤差はO(sqrt(n / q))のようにスケーリングされるため、相対誤差はO(sqrt(1 / nq))のようにスケーリングされます。
一般化された固有値の計算がより効率的である場合は、一般化された固有値を計算してから、A*v = lambda* B *v
すべてのラムダを合計することができます。