9

Sを対称nxn行列、Aをamxn行列とします。

与えられた:B = A * S * A_transpose(ここで、「*」は行列積演算を表します)

Bも対称行列になります。

tuxfamily Eigenライブラリバージョン3を使用して、この計算を実装するためのクリーンで効率的な方法は何ですか?(効率的とは、対称性によってBの要素が不要になる場合、Bの要素の重複計算が実行されないことを意味します。)

SelfAdjointViewを利用すると思いますが、高低を検索しましたが、このきれいな例は見つかりませんでした。

アプリケーションはカルマンフィルターであり、(対称)共分散行列を含む操作に大きく依存しているため、実装/設計が正しいことを確認したいと思います。

ありがとうございました!

4

1 に答える 1

6

これは非常に単純なはずです。あなた自身が言うように、あなたはあなたの行列がSelfAdjointViewを通して対称行列であるという事実をEigenに認識させることができます。結果を保存するために使用できるTriangularViewという別のビューもあります。TriangularViewに割り当てる場合のリファレンスによると、rhsの関連部分のみが評価されます。それで

B.triangularView<Upper>() = A * S.selfadjointView<Upper>() * A.transpose();

結果はBの上三角に保存されます。その後B.selfadjointView<Upper>、他の計算で使用できます。これが必要な操作の観点から最適であるかどうかはわかりません。検証するためにベンチマークを実行する可能性があります。

于 2012-11-04T20:14:40.907 に答える