3

こんにちは私は行列反転(線形代数)についていくつかの研究をしていて、アルゴリズムにC ++テンプレートプログラミングを使用したかったのですが、ガウスの消去法やLU分解のような方法がいくつかあることがわかりました。関数LU_factorize(c ++ブーストライブラリ)

  1. プログラマーや数学者の観点から、他に良い方法(長所/短所)があるかどうか知りたいですか?

  2. 他に高速な方法がない場合、Boostライブラリに(行列)逆関数がすでにありますか?、私はたくさん検索しましたが、何も見つかりませんでした。

4

5 に答える 5

5

おっしゃるように、標準的なアプローチは、LU分解を実行してから、IDを解くことです。これは、LAPACKライ​​ブラリを使用して、たとえばdgetrf(factor)およびdgetri(compute reverse)を使用して実装できます。他のほとんどの線形代数ライブラリには、ほぼ同等の関数があります。

行列が特異またはほぼ特異である場合に、より優雅に劣化する低速の方法がいくつかあり、そのために使用されます。たとえば、Moore-Penroseの疑似逆行列は、行列が可逆である場合は逆行列に等しく、行列が可逆でない場合でも役立つことがよくあります。特異値分解を使用して計算できます。

于 2010-07-28T20:32:46.257 に答える
3

Eigenのソースコードをご覧になることをお勧めします。

于 2010-07-28T20:27:40.760 に答える
2

以下の流行語については、GoogleまたはWikipediaをご覧ください。

まず、本当に逆が必要なことを確認してください。システムを解くには、行列を反転する必要はありません。行列の反転は、単位基底ベクトルを右側として、n個のシステムを解くことによって実行できます。それで、私はシステムを解くことに焦点を合わせます、なぜならそれは通常あなたが望むものだからです。

それは「大きい」が何を意味するかによります。分解に基づくメソッドは、通常、行列全体を格納する必要があります。行列を分解したら、一度に複数の右側を解くことができます(したがって、行列を簡単に反転できます)。因数分解の方法については、すでに知っている可能性が高いため、ここでは説明しません。

行列が大きい場合、その条件数はゼロに近い可能性が非常に高いことに注意してください。これは、行列が「数値的に可逆ではない」ことを意味します。対処法:前処理。これについてはウィキペディアを確認してください。記事はよく書かれています。

行列が大きい場合は、保存しないでください。ゼロが多い場合は、スパース行列です。構造(バンド対角ブロック行列など)があり、そのような行列を含むシステムを解くための特殊な方法があるか、ないかのどちらかです。

明確な構造のないスパース行列に直面した場合、または保存したくない行列に直面した場合は、反復法を使用する必要があります。これらは、特定の形式のストレージを必要としない行列とベクトルの乗算のみを含みます。必要なときに係数を計算したり、ゼロ以外の係数を必要な方法で保存したりできます。

方法は次のとおりです。

  • 対称定値正行列の場合:共役勾配法。つまり、Ax = bを解くと、1/2 x ^ TA x-x ^Tbが最小化されます。
  • 一般的な行列の双共役勾配法。しかし不安定です。
  • 最小残差法、または最良のGMRES。詳細については、ウィキペディアの記事を確認してください。アルゴリズムを再開する前に、反復回数を試してみることをお勧めします。

そして最後に、格納する非ゼロ要素の数を最小限に抑えるために特別に設計されたアルゴリズムを使用して、スパース行列を使用してある種の因数分解を実行できます。

于 2010-08-02T12:17:35.413 に答える
1

マトリックスが実際にどれだけ大きいかにもよりますが、いつでも列の小さなサブセットだけをメモリに保持する必要があります。これには、行列要素への低レベルの書き込みおよび読み取り操作をオーバーライドする必要がある場合がありますが、それ以外の点ではかなりまともなライブラリであるEigenで可能かどうかはわかりません。

マトリックスが非常に大きいこれらの非常に狭いケースでは、ほとんどがディスクに格納されているアレイへのメモリアクセス用に設計されたStlXXLライブラリがあります

編集より正確には、使用可能なRAMで修正されない行列がある場合、推奨されるアプローチはブロック単位の反転を行うことです。行列は、各行列がRAMに収まるまで再帰的に分割されます(これはもちろんアルゴリズムの調整パラメーターです)。ここで注意が必要なのは、マトリックスがディスクに引き出されたりディスクから引き出されたりするときに、CPUがマトリックスを不足させて反転させないようにすることです。StlXXLを使用した場合でも、これが主なボトルネックになる可能性があるため、これには適切な並列ファイルシステムでの調査が必要になる場合があります。ただし、マントラを繰り返します。時期尚早の最適化は、すべてのプログラミングの悪の根源ですこの悪は、コーディング、実行、プロファイルのクレンジングの儀式でのみ追放することができます

于 2011-02-14T19:25:55.977 に答える
0

LAPACKの周りにC++ラッパーを使用することをお勧めします。LAPACKは非常に成熟したコードです。十分にテストされ、最適化されています。

そのようなラッパーの1つに、Intel MathKernelLibraryがあります。

于 2010-07-28T20:59:20.507 に答える