ブーストは1つ持っていますか? ここで、A、y、およびxはそれぞれ行列(疎で非常に大きくなり得る)およびベクトルです。 yまたはxのいずれかが不明です。y = Axのためのブーストの線形代数解答
私はここでそれを見つけるように見えることはできません。 http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm
ブーストは1つ持っていますか? ここで、A、y、およびxはそれぞれ行列(疎で非常に大きくなり得る)およびベクトルです。 yまたはxのいずれかが不明です。y = Axのためのブーストの線形代数解答
私はここでそれを見つけるように見えることはできません。 http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm
線形ソルバーは、一般的にBLASライブラリのより高いレベルの拡張であるLAPACKライブラリの一部です。 Linuxを使用している場合、Intel MKLには、高密度および疎行列の両方に最適化された良いソルバーがあります。あなたが窓の上にいる場合、MKLは無料で1ヶ月の試用期間を設けています。正直言って、他のものは試していません。 Atlasのパッケージには無料のLAPACKが実装されていますが、Windows上で実行するのがどれほど難しいかはわかりません。
とにかく、あなたのシステムで動作するLAPACKライブラリを探してください。
注:LAPACKは疎なソルバではないので、疎な行列を非常に効率的に格納することはなく、スパースなシステムを特に効率的に解決することもできません。 Intel MKLには、スパースソルバー(http://software.intel.com/sites/products/collateral/hpc/mkl/mkl_brief.pdf)、特にPARDISO直接スパースソルバー(http://www.pardiso-project .org)。高密度で疎な数値線形代数ソフトウェアの概要については、http://www.netlib.org/utk/people/JackDongarra/la-sw.html – las3rjock
を参照してください。 MKLライブラリを控え、PARDISOを手に入れることをお勧めします。あなたはお金を節約し、ライセンス問題に対処する必要はありません。 – DeusAduro
ブーストドキュメントを読むと、w.r.t xが解決されていないようです。xが実装されています。 yを解くことは、行列 - ベクトル積の問題に過ぎず、ウルフの中で実行されているようです。心に留めておくべき
一つは、BLASのみをベクトルや行列のタイプが...加算、乗算などのような「簡単」の操作を実装することです。 BLASの上に構築されたLAPACKの一部である、より高度なもの(線形問題解決、「x y = A xを解く」のような固有ベクトル、およびco)私はその点で何が増強しているのか分かりません。
ブーストの線形代数パッケージのチューニングは、「密行列」に焦点を当てています。 私が知る限り、Boostのパッケージにはリニアシステムソルバーはありません。 "Numerical Recipe in C(http://www.nr.com/oldverswitcher.html)"でソースコードを使用するのはどうですか?
注。ソースコードの微妙なインデックスのバグ(いくつかのコードは、1から配列インデックスの開始を使用しています)
+1リンクありがとうございます。 –
これは機能であるバグではありません! Fortranユーザーにとって、アルゴリズムをより美味しくすることでした。 –
がJAMA/TNTを見てみましょうが存在する場合があります。私は疎でない行列に対してのみ使用しています(どちらもソルバーユーティリティメソッドを持つQRまたはLU分解を必要とします)が、疎行列のためのいくつかの機能があるようです。 Ax = bのための最高のソルバーの
一つAがスパースであるとき、ティム・デイヴィスのUMFPACK
UMFPACK
は、AのスパースLU分解を計算されたそれは は時にMATLABで舞台裏で使用されますアルゴリズムですあなたはx=A\b
と入力します(そして、Aはまばらな と四角です)。 UMFPACK
はフリーソフトウェア(GPL)
y = Axで、xはわかっていますが、yはありません。線形システムを解くことではなく、疎行列ベクトル乗算を実行してyを計算します。
はい、あなたはboostのUublasライブラリで線形方程式を解くことができます。ここでは一つの短方法はLU-因数分解を使用しているとバック代わりに逆を取得するには:
using namespace boost::ublas;
Ainv = identity_matrix<float>(A.size1());
permutation_matrix<size_t> pm(A.size1());
lu_factorize(A,pm)
lu_substitute(A, pm, Ainv);
だから、線形システムアックス= Yを解決するために、あなたは、トランス式(A)アックス=トランス(A)を解決するだろう(trans(A)A)^ - 1の逆数を取ってx:x =(trans(A)A)^ - 1Ayを得ることによって、
Ax = yの解が必要な場合は、 'permutation_matrix
私はBoostやC++について何も知らないので、Aが可逆行列である場合にのみ解が存在することをコメントします。 Aが可逆でない場合、最小二乗解x =(A^T A)^( - 1)A^T yが最も近いものです。 –
これは行列方程式を解く方法では一般的ではありません(逆数は一般的に数値安定性と速度の両方にとって悪い)、QRまたはLU分解とその後の逆置換があります。 –