Boostの線形代数ソy=Ax
-
22-07-2019 - |
質問
な向上を拡大したものである。が、xとyはマトリックス(少なく、非常に多くなることもある)、ベクター。はy、xができます。
できないようです。 http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm
解決
線形ソルバーは、LAPACKにはより高いレベルのBLASライブラリ。の場合はLinuxのIntel MKLはいくつかの良いソルバーの研究開発、最適化されたものための高密度化、疎行列.の場合はwindows MKL一ヶ月の試用のための無料---実を言うというその他のものがあります。ピックアップしました。アトラスのパッケージには無料のLAPACK実装がなどのハードで走windows上でしか利用できません。
思索のためにLAPACK図書館を作ります。
他のヒント
はい、boostのublasライブラリを使用して線形方程式を解くことができます。 LU-factorizeと逆代入を使用して逆を取得する1つの簡単な方法を次に示します。
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);
したがって、線形システムAx = yを解くには、(trans(A)A)^-1の逆数をとってxを取得することにより、方程式trans(A)Ax = trans(A)yを解きます:x = (trans(A)A)^-1Ay。
Aがスパースの場合、Ax = bの最適なソルバーの1つは、Tim Davisの UMFPACK
UMFPACK
は、AのスパースLU分解を計算します。これは、
x = A \ b
を入力すると、Matlabの背後で使用されます(Aはスパースです)
および正方形)。 UMFPACK
はフリーソフトウェア(GPL)です
また、y = Axであり、xが既知であるがyが不明である場合、線形システムを解くことではなく、スパース行列ベクトル乗算を実行してyを計算します。
ブーストドキュメントを読むと、w.r.t xの解決が実装されているようには見えません。 yで解くのは行列ベクトル積の問題であり、ublasで実装されているようです。
心に留めておくべきことの1つは、blasはベクトル型と行列型の加算、乗算などの「簡単な」演算のみを実装するということです。より高度なもの(x y = A xのような線形問題解決、固有ベクトル、co)は、BLASの上に構築されたLAPACKの一部です。その点でブーストが提供するものがわかりません。
Boostの線形代数パッケージの調整は、「密な行列」に焦点を合わせました。 私の知る限り、Boostのパッケージには線形システムソルバーはありません。 Cの&quot; Numerical Recipeでソースコードを使用する方法( http://www.nr.com/oldverswitcher .html )&quot;
注。ソースコードにわずかなインデックスバグがある可能性があります(一部のコードでは、1から始まる配列インデックスが使用されます)
JAMA / TNT をご覧ください。非スパース行列のみに使用しました(どちらもソルバーユーティリティメソッドを備えたQRまたはLU分解が必要な場合があります)が、明らかにスパース行列用の機能がいくつかあります。