BLAS,LAPACKまたはATLASのインターフェース

密行列でのパフォーマンスを向上させるために, gmm :: dense_matrix<T> 型の操作のいくつかを``LAPACK`(http://www.netlib.org/lapack/)または``ATLAS`(http://math-atlas.sourceforge.net/), T=float,double に対しては, std :: complex<float> または std::complex<double> でインタフェースすることができます.実際, ATLAS については,これまで具体的なインターフェースが作られていなかったので, ATLAS のfortranインターフェースを使うべきです.

このインタフェースを使うには, Gmm++ をインクルードする前に,最初に GMM_USES_LAPACK を定義する必要があります.

#define GMM_USES_LAPACK
#include <gmm/gmm.h>

... your code

または,コンパイラのコマンドラインで -DGMM_USES_LAPACK を指定します.もちろん, LAPACK または ATLAS ライブラリをリンクする必要もあります.例えば,標準的なLinuxの設定とg++コンパイラでは, LAPACK をリンクするライブラリは以下のようになります.

g++ ...  -llapack -lblas -lgfortanbegin -lgfortran

ATLAS をリンクします.

g++ ... /usr/lib/atlas/liblapack.a /usr/lib/atlas/libblas.a -latlas -lgfortranbegin -lgfortran

ライブラリ libgfortranbeginlibgfortran はg++コンパイラに固有で,他のコンパイラとは異なる場合があります.

この構成が機能しない場合は,システム管理者に問い合わせてください.

次の操作がインタフェースされます.

vect_norm2(std::vector<T>)

vect_sp(std::vector<T>, std::vector<T>)
vect_sp(scaled(std::vector<T>), std::vector<T>)
vect_sp(std::vector<T>, scaled(std::vector<T>))
vect_sp(scaled(std::vector<T>), scaled(std::vector<T>))

vect_hp(std::vector<T>, std::vector<T>)
vect_hp(scaled(std::vector<T>), std::vector<T>)
vect_hp(std::vector<T>, scaled(std::vector<T>))
vect_hp(scaled(std::vector<T>), scaled(std::vector<T>))

add(std::vector<T>, std::vector<T>)
add(scaled(std::vector<T>, a), std::vector<T>)

mult(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>)
mult(transposed(dense_matrix<T>), dense_matrix<T>, dense_matrix<T>)
mult(dense_matrix<T>, transposed(dense_matrix<T>), dense_matrix<T>)
mult(transposed(dense_matrix<T>), transposed(dense_matrix<T>),
     dense_matrix<T>)
mult(conjugated(dense_matrix<T>), dense_matrix<T>, dense_matrix<T>)
mult(dense_matrix<T>, conjugated(dense_matrix<T>), dense_matrix<T>)
mult(conjugated(dense_matrix<T>), conjugated(dense_matrix<T>),
     dense_matrix<T>)

mult(dense_matrix<T>, std::vector<T>, std::vector<T>)
mult(transposed(dense_matrix<T>), std::vector<T>, std::vector<T>)
mult(conjugated(dense_matrix<T>), std::vector<T>, std::vector<T>)
mult(dense_matrix<T>, scaled(std::vector<T>), std::vector<T>)
mult(transposed(dense_matrix<T>), scaled(std::vector<T>),
     std::vector<T>)
mult(conjugated(dense_matrix<T>), scaled(std::vector<T>),
     std::vector<T>)

mult_add(dense_matrix<T>, std::vector<T>, std::vector<T>)
mult_add(transposed(dense_matrix<T>), std::vector<T>, std::vector<T>)
mult_add(conjugated(dense_matrix<T>), std::vector<T>, std::vector<T>)
mult_add(dense_matrix<T>, scaled(std::vector<T>), std::vector<T>)
mult_add(transposed(dense_matrix<T>), scaled(std::vector<T>),
         std::vector<T>)
mult_add(conjugated(dense_matrix<T>), scaled(std::vector<T>),
         std::vector<T>)

mult(dense_matrix<T>, std::vector<T>, std::vector<T>, std::vector<T>)
mult(transposed(dense_matrix<T>), std::vector<T>, std::vector<T>,
     std::vector<T>)
mult(conjugated(dense_matrix<T>), std::vector<T>, std::vector<T>,
     std::vector<T>)
mult(dense_matrix<T>, scaled(std::vector<T>), std::vector<T>,
     std::vector<T>)
mult(transposed(dense_matrix<T>), scaled(std::vector<T>),
     std::vector<T>, std::vector<T>)
mult(conjugated(dense_matrix<T>), scaled(std::vector<T>),
     std::vector<T>, std::vector<T>)
mult(dense_matrix<T>, std::vector<T>, scaled(std::vector<T>),
     std::vector<T>)
mult(transposed(dense_matrix<T>), std::vector<T>,
     scaled(std::vector<T>), std::vector<T>)
mult(conjugated(dense_matrix<T>), std::vector<T>,
     scaled(std::vector<T>), std::vector<T>)
mult(dense_matrix<T>, scaled(std::vector<T>), scaled(std::vector<T>),
  std::vector<T>)
mult(transposed(dense_matrix<T>), scaled(std::vector<T>),
     scaled(std::vector<T>), std::vector<T>)
mult(conjugated(dense_matrix<T>), scaled(std::vector<T>),
     scaled(std::vector<T>), std::vector<T>)

lower_tri_solve(dense_matrix<T>, std::vector<T>, k, b)
upper_tri_solve(dense_matrix<T>, std::vector<T>, k, b)
lower_tri_solve(transposed(dense_matrix<T>), std::vector<T>, k, b)
upper_tri_solve(transposed(dense_matrix<T>), std::vector<T>, k, b)
lower_tri_solve(conjugated(dense_matrix<T>), std::vector<T>, k, b)
upper_tri_solve(conjugated(dense_matrix<T>), std::vector<T>, k, b)

lu_factor(dense_matrix<T>, std::vector<int>)
lu_solve(dense_matrix<T>, std::vector<T>, std::vector<T>)
lu_solve(dense_matrix<T>, std::vector<int>, std::vector<T>,
         std::vector<T>)
lu_solve_transposed(dense_matrix<T>, std::vector<int>, std::vector<T>,
         std::vector<T>)
lu_inverse(dense_matrix<T>)
lu_inverse(dense_matrix<T>, std::vector<int>, dense_matrix<T>)

qr_factor(dense_matrix<T>, dense_matrix<T>, dense_matrix<T>)

implicit_qr_algorithm(dense_matrix<T>, std::vector<T>)
implicit_qr_algorithm(dense_matrix<T>, std::vector<T>,
                      dense_matrix<T>)
implicit_qr_algorithm(dense_matrix<T>, std::vector<std::complex<T> >)
implicit_qr_algorithm(dense_matrix<T>, std::vector<std::complex<T> >,
                      dense_matrix<T>)

もちろん,必要に応じて別の操作をインターフェースすることは難しくありません.

次のインタフェースは Gmm++ に存在するアルゴリズムに対応しません.

gesvd (特異値分解)へのインタフェース:

svd(dense_matrix<T> &X, dense_matrix<T> &U,
    dense_matrix<T> &Vt, std::vector<T> sigma);
svd(dense_matrix<std::complex<T> > &X, dense_matrix<std::complex<T> > &U,
    dense_matrix<std::complex<T> > &Vt, std::vector<T> sigma);