2016-08-28 1 views
1

でコードされていますアイゲン、逆に失敗します、そして逆は()私はここで、逆行列を取得したいので、遅い

if (m.rows() == m.fullPivLu().rank()) 
{ 
    res = m.inverse(); 
} 

mresの寸法は全て5000回5000され、私は高性能コンピューティングマシン(Linux、Tianhe 2 SuperComputer)でコードを実行し、プロセスはres = m.inverse();で終了し、コアファイルやダンプ情報は生成されませんでした。コンソールはkilledを返し、プロセスは終了しました。

しかし、私のUbuntuノートパソコンには何も問題はありません。

そして、inverse()の性能は悪く、多くの時間がかかります。

なぜ、inverse()が高性能マシンで殺されたのですか?ありがとうございました!

+0

どのようなパフォーマンスが得られますか?あなたは何を期待していますか?逆はO(n^3)であることを忘れないでください。私たちのほとんどがアクセスできないコンピュータからどんな種類のメッセージ/ダンプ/何かを取得していますか? –

+0

@AviGinsburg、それは逆を得るのは非常に遅かった。コアファイルやダンプ情報は生成されませんでした。コンソールが復帰し、プロセスが終了しました。 –

答えて

3

フルピボットLUは、実装に関係なく、非常に遅いことが知られています。

PartialPivLUを使用すると、パフォーマンスが向上します。次に、Eigenを最大限に活用するには、3.3-beta2リリースを使用し、FMA(-mfma)とOpenMP(たとえば-fopenmp)の両方のコンパイルでコンパイルし、コンパイラ最適化-O3を有効にすることを忘れないでください。この操作には数秒を要しません。

最後に、実際に逆行列を明示的に計算する必要がありますか?それをいくつかのベクトルまたは行列(すなわち、A^-1 * BまたはB * A^-1)にのみ適用すれば、明示的にそれを計算するのではなく、因数分解された形で逆関数をよりよく適用します。固有3.3:

これらの式で
MatrixXd A = ...; 
PartialPivLU<MatrixXd> lu(A); 
x = lu.inverse() * b; // solve Ax=b, same as x = lu.solve(b); 
x = b * lu.inverse(); // solve xA=b 

、逆は明示的に計算ないです!

+0

ありがとう、ggael。行列の逆行列を求める必要があります。 Eigenのコンパイル最適化に関するドキュメントを投稿できますか? –

関連する問題