11

編集。この質問が出されたので、トモグラフィーの線形連立方程式を解くことで博士号を取得しました。この質問にはまだ多くのトラフィックが寄せられているため、@sellibitze による回答の最初の文を強調したいと思います: There is not simple answer . それは行列の性質に大きく依存し、ほとんどの場合、行列を反転させたくないでしょう。

さて、これは簡単に答えられると思っているこの非常に無実な男の元の質問に...


行列反転アルゴリズムについてグーグルで検索しているときに、コードでこれを行う方法についていくつかの方法 (および意見!) があることがわかりました。どの方法が最も速いか、またはパフォーマンスが最も高いかを考えましたが、その答えを見つけようとしても何も見つかりませんでした。

場合によっては疑似逆数を計算できることを知っています (SVD、cholevsky などを使用)。実際にそれらのいくつかをコードで使用し、数回逆数が存在しないことを知っています。特定の問題に対する特定の答えを見つけるのは簡単ですが、逆行列であるこの大きな (巨大な!) 問題に対する一般的な直感はありません。

だから私の質問は:

小さな行列のパフォーマンスが最も優れているのはどの方法ですか? そして正確に?大きな行列はどうですか?

私の個人的なケースは、何千回も反転する必要がある 6x6 (EDIT:symetric) マトリックスであり (はい、はい、異なる値で)、高精度が必要ですが、確かに速度は非常に便利です。

私はコードを探しているわけではないことに注意してください。私の場合に最も適した答えなら何でも自分でコーディングしますが、これは多くのプログラマーが知りたいと思っている質問だと思います。

4

1 に答える 1

5

簡単な答えはありません。この記事を読んで理解していることを確認してください。

2x2 行列の計算では、行列式を含む単純なフォーミュラを使用して逆計算を行うことができます。しかし、より大きなものについては、ピボット LU 因数分解などの因数分解を好みます。パフォーマンスに関心があり、大規模な疎行列を扱う場合は、反復ソルバーが適切な場合があります。または、MUMPS (マルチフロント大規模並列ソルバー) を試して、パフォーマンスを測定することもできます。反復ソルバーの問題は、収束速度が逆問題の条件と適切な前提条件を見つけるかどうかに大きく依存することです。

おそらく、Eigenライブラリから始めて、ピボット LU 因数分解を最初に試す必要があります。

于 2013-01-16T15:00:26.983 に答える