2009-08-04 11 views
8

ブーストは1つ持っていますか? ここで、A、y、およびxはそれぞれ行列(疎で非常に大きくなり得る)およびベクトルです。 yまたはxのいずれかが不明です。y = Axのためのブーストの線形代数解答

私はここでそれを見つけるように見えることはできません。 http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm

+2

私はBoostやC++について何も知らないので、Aが可逆行列である場合にのみ解が存在することをコメントします。 Aが可逆でない場合、最小二乗解x =(A^T A)^( - 1)A^T yが最も近いものです。 –

+4

これは行列方程式を解く方法では一般的ではありません(逆数は一般的に数値安定性と速度の両方にとって悪い)、QRまたはLU分解とその後の逆置換があります。 –

答えて

4

線形ソルバーは、一般的にBLASライブラリのより高いレベルの拡張であるLAPACKライ​​ブラリの一部です。 Linuxを使用している場合、Intel MKLには、高密度および疎行列の両方に最適化された良いソルバーがあります。あなたが窓の上にいる場合、MKLは無料で1ヶ月の試用期間を設けています。正直言って、他のものは試していません。 Atlasのパッケージには無料のLAPACKが実装されていますが、Windows上で実行するのがどれほど難しいかはわかりません。

とにかく、あなたのシステムで動作するLAPACKライ​​ブラリを探してください。

+4

注:LAPACKは疎なソルバではないので、疎な行列を非常に効率的に格納することはなく、スパースなシステムを特に効率的に解決することもできません。 Intel MKLには、スパースソルバー(http://software.intel.com/sites/products/collat​​eral/hpc/mkl/mkl_brief.pdf)、特にPARDISO直接スパースソルバー(http://www.pardiso-project .org)。高密度で疎な数値線形代数ソフトウェアの概要については、http://www.netlib.org/utk/people/JackDongarra/la-sw.html – las3rjock

+0

を参照してください。 MKLライブラリを控え、PARDISOを手に入れることをお勧めします。あなたはお金を節約し、ライセンス問題に対処する必要はありません。 – DeusAduro

3

ブーストドキュメントを読むと、w.r.t xが解決されていないようです。xが実装されています。 yを解くことは、行列 - ベクトル積の問題に過ぎず、ウルフの中で実行されているようです。心に留めておくべき

一つは、BLASのみをベクトルや行列のタイプが...加算、乗算などのような「簡単」の操作を実装することです。 BLASの上に構築されたLAPACKの一部である、より高度なもの(線形問題解決、「x y = A xを解く」のような固有ベクトル、およびco)私はその点で何が増強しているのか分かりません。

3

ブーストの線形代数パッケージのチューニングは、「密行列」に焦点を当てています。 私が知る限り、Boostのパッケージにはリニアシステムソルバーはありません。 "Numerical Recipe in C(http://www.nr.com/oldverswitcher.html)"でソースコードを使用するのはどうですか?

注。ソースコードの微妙なインデックスのバグ(いくつかのコードは、1から配列インデックスの開始を使用しています)

+0

+1リンクありがとうございます。 –

+1

これは機能であるバグではありません! Fortranユーザーにとって、アルゴリズムをより美味しくすることでした。 –

3

JAMA/TNTを見てみましょうが存在する場合があります。私は疎でない行列に対してのみ使用しています(どちらもソルバーユーティリティメソッドを持つQRまたはLU分解を必要とします)が、疎行列のためのいくつかの機能があるようです。 Ax = bのための最高のソルバーの

4

一つAがスパースであるとき、ティム・デイヴィスのUMFPACK

UMFPACKは、AのスパースLU分解を計算されたそれは は時にMATLABで舞台裏で使用されますアルゴリズムですあなたはx=A\bと入力します(そして、Aはまばらな と四角です)。 UMFPACKはフリーソフトウェア(GPL)

y = Axで、xはわかっていますが、yはありません。線形システムを解くことではなく、疎行列ベクトル乗算を実行してyを計算します。

17

はい、あなたは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を得ることによって、

+10

Ax = yの解が必要な場合は、 'permutation_matrix pm(A.size1());を使ってください。 lu_factorize(A、pm); lu_substitute(A、pm、y);そして 'y'は解で置き換えられます。 – Joey

関連する問題