Ax = bシステムを解くためのライブラリが必要です。ここで、Aは非対称のスパース行列で、行ごとに8つのエントリがあります(かなり大きい場合があります)。双共役勾配法を実装するライブラリは問題ないと思いますが、機能するライブラリが見つかりません(iml ++を試しましたが、iml ++ / sparselib ++パッケージにいくつかのヘッダーがありません)。任意のヒント?
3 に答える
過剰決定系を処理する標準的な方法があります。たとえば、ウィキペディアは次のように述べています。
線形連立方程式のセットは、Ax=yとして行列形式で記述できます。変数よりも多くの方程式がある場合、システムは過剰決定と呼ばれ、(一般に)解がありません。次に、システムを(A T A)x = ATyに変更できます。新しいシステムには変数と同じ数の方程式があり(行列A T Aは正方行列です)、通常の方法で解くことができます。解は、元の過剰決定システムの最小二乗解であり、元のシステムの2つの側の間の不一致の尺度であるユークリッドノルム|| Ax −y||を最小化します。
したがって、任意の標準的な正方行列スパースソルバーを使用できます。
個人的には、 TimDavisによるCSparseの直接ソルバーを使用しています。ティムは、多くの優れた直接スパースソルバーを作成しました。実際、彼のUMFPACKは別の優れたオプションであり、たとえばMATLABで使用されます。これらのソルバーは両方ともCインターフェースを提供することに注意してください。ネイティブC++インターフェースを備えたものを探しているなら、私は何も提供しません。
私は反復ソルバーの経験があります。しかし、私が調べていた問題については、反復法が大きな行列に対して不安定になることがわかりました。私は直接ソルバーではるかに多くの成功を収めてきました。もちろん、問題が投げかけるマトリックスのタイプによっては、逆の経験をする可能性があることは完全にもっともらしいことです。
ARPACKはスパースな非対称行列の問題を解決するようです。C++バージョンがあります
David Heffernanの答え:重要なことを1つ忘れないでください。行列Aは、線形独立の列を持つようにチェック/証明する必要があります。そうしないと、(A ^ TA)が特異になる可能性があります(もちろん、機能しません)。