2

BLAS のおかげで、C 言語でいくつかの高速な操作を実現したいと考えています (別のライブラリを選択する機会はありません。私のプロジェクトで利用できるのはこれだけです)。次の操作を行います。

  • 正方行列を反転し、
  • 行列積 A*B を作成します。ここで、A は計算された逆行列で、B はベクトルです。
  • 2 つの (非常に長い) ベクトルを合計します。

BLASならこのような操作が可能で、非常に高速だったと聞きました。しかし、私はそれを理解して適用することができるものを検索しても何も見つかりませんでした (つまり、C コード行で)。

4

3 に答える 3

5

BLAS ライブラリは、もともと Fortran で書かれています。C へのインターフェイスは CBLAS と呼ばれ、すべての関数にはcblas_.

残念ながら BLAS では、最後の 2 つの点にしか直接対処できません。

  • sgemv(単精度) またはdgemv(倍精度) は、行列とベクトルの乗算を実行します
  • saxpy(単精度) またはdaxpy(倍精度) は、一般的なベクトル間の加算を実行します

BLAS は、行列を反転するより複雑な操作を扱いません。そのために、BLAS 上に構築され、線形代数演算を提供する LAPACK ライブラリがあります。LAPACK での一般的な行列の反転はsgetri(単精度) またはdgetri(倍精度) で行われますが、対称行列のような特定のケースを処理する他の反転ルーチンがあります。後でベクトルを乗算するためだけに行列を反転する場合、それは基本的に連立一次方程式を解くことであり、そのためにsgesv(単精度) とdgesv(倍精度) があります。

基本的に LAPACK ルーチンの 1 つを (再) 実装することによってのみ、BLAS 演算を使用して行列を反転できます。

詳細と例については、多くの BLAS/LAPACK 実装の 1 つを参照してください ( Intel MKLATLASなど) 。

于 2012-05-13T16:50:05.663 に答える
1

技術的には、あなたが求めていることを行うことができますが、通常はより安定しています:

  • LU 分解やコレスキー分解などの三角分解
  • 因数分解された行列で三角ソルバーを使用する

BLASはこれを行うことができます。技術的には「LAPACK」に含まれていますが、ほとんど/多くの BLAS 実装には LAPACK が含まれています。たとえば、OpenBLAS と Intel の MKL の両方が含まれています。

これらを C から呼び出すには、次の点に注意してください。

  • 関数名は小文字にし、_接尾辞を付けます。つまりdgetrf_dtrsm_
  • すべてのパラメーターはポインターである必要がありますint *mdouble *a
于 2013-06-24T15:37:30.980 に答える