web-dev-qa-db-ja.com

線形方程式系を解く最も効率的な方法

(n x n)対称行列Aと(n x 1)ベクトルBがあります。基本的には、xについてAx = bを解くだけです。問題は、Aが潜在的に大規模になることです。だから私はC++で線形方程式を解くための最も効率的なアルゴリズムを探しています。 Eigenライブラリーを見ました。どうやらSVDメソッドがありますが、遅いと言われています。 x = inverse(A)* bを解くことも、最適ではないようです。 uBLASは高速ですか?より効率的な方法はありますか?ありがとう。

編集:行列Aは正定であり、スパースではありません。

22
aesir

Ax = b形式の線形方程式系を解く最良の方法は、次のことです。

  • AA = M1 * M2形式に分解します(M1およびM2は三角形です)
  • 後方置換を使用してyM1 * y = bを解く
  • 後方置換を使用してxM2 * x = yを解く

正方行列の場合、手順1では LU Decomposition を使用します。

非正方行列の場合、手順1では QR分解 を使用します。

行列Aが正定値であり、スパースではない場合、最初のステップで Cholesky Decomposition を使用します。

固有値を使用する場合は、最初に 分解 を、次に 三角解法 を使用する必要があります。

それでもこれが遅い場合は、ありがたいことに、パフォーマンスの向上に役立つ多数の線形代数ライブラリが利用可能です。探しているルーチンはdpotrsです。これを実装したライブラリの一部は次のとおりです。

プロジェクト全体でeigenを使用している場合、 here の説明に従って、必要なLAPACKルーチンをインターフェイスできます。

43