LAPACKとBLASを使用して


12

既存のコードをMATLABからC ++に移植しており、を解決する線形システムを持っています(より一般的な形式A x = bではなく)xA=bAx=b

行列は高密度で一般的な形式ですが、1000x1000以下です。そのため、MATLABでは、解は関数またはスラッシュ表記法で見つかりますAmrdivide(b,A)x = b/A;

BLASおよびLAPACKルーチンを使用して、C ++コードでこれを解決するにはどうすればよいですか?

私は、LAPACKルーチンに精通していDGESV解きするために、XAx=bx

したがって、私が考えていたのは、行列の転置恒等式を使用していくつかの操作を行うことです。

(xA)T=bT

ATxT=bT

xT=(AT)1bT

次にDGESV、転置操作を使用して最終形式を解きます。(Aを転置するコストとシステムを解決するコスト)ATA

より効率的なアプローチや他の方法でより良いアプローチがありますか?

BOOST uBLASライブラリからのBLAS実装だけでなく、LAPACKライ​​ブラリルーチンへのバインドと同様に、マトリックスクラスとベクトルクラスを使用しています。私はこのセットアップを他の操作に正常に使用してきましたが、これらのライブラリに限定されたソリューションを見つけたいと思っています。

また、コードのセットアップ中にこのタイプの操作を実行するのは数回だけなので、パフォーマンスは重要な問題ではありません。

たぶん、このMATLABのドキュメント上には、mrdivide他人のために有用です。

回答:


10

正方形 自明な答え:A T x = bのときも解くを使用します。AdgesvxATx=bTRANS = 'T'

BLASまたはLAPACKを使用すると、行列を転置(メモリ内の要素を交換)する必要はほとんどありません。ほとんどのサブルーチンにはTRANS、転置行列または異なるメモリレイアウトで保存された行列の操作に対応する引数があります。(転置は、Fortran連続メモリレイアウトをC連続メモリレイアウトに、またはその逆に変更することと同等です。)


答えと説明をありがとう!LAPACKを使用した作業はほとんど行われていませんが、TRANSオプションを探す必要があることがわかりました。私はTRANS引数をうまく処理するのboost::numeric::bindings::lapack::gesvx()に苦労していますが、これはここでの私の質問の一部ではありません。成功した場合は、その方法についてのメモをお送りします。
-NoahR

私はを使用した実用的なソリューションを持っていますがgesvx()、途中でつまずくことがあります。TRANS引数が「T」の場合、LAPACKのドキュメントは言うgesvx解き、本当にそれが解決A T X T = B Tを入力引数の形ので、XBはその非転置であることが予想されます形。したがって、引数Aは転置され、XおよびBATX=BATXT=BTXBAXBありません。素晴らしい、それはより便利です。ブースト数値バインディングを使用しようとして他の誰かがこれにつまずいた場合、このsolnで使用される転置インターフェイスを取得できなかったと言います。バインディングを介して動作します。
NoahR

OK、gesvx転置形式を使用するコツを見つけましたboost::numeric::bindings。転置行列を関数でラップします。この識別パラメータとして転置タイプ: ATtrans()boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );
NoahR

0

LAPACKに含まれているSVDのQR分解を使用することにより、の擬似逆関数を計算できます。A

xA=bxQR=bバツ=bR1QT

A


3
ARR1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.