Gmm++ によって提供される行列およびベクトル型

どのようなベクトル型や行列型(参照である場合を除く)でもコンストラクタでインスタンス化することができます.

Vector V(n);        // build a vector of size n.
Matrix M(n, m);     // build a matrix with n rows and m columns.

Gmm++ の内部では他のコンストラクタは使用されていません.また,行列やベクトル型と互換性を持たせたい場合は,他のコンストラクタを使用しないでください.

Gmm++ でインターフェイスされる各ベクトル型は,次の構文でコンポーネントにアクセスできます.

a = V[i];    // read the ith component of V.
V[i] = b;    // write the ith component of V.

ベクトルが定数参照でない場合に使用できる書き込みアクセスについて.行列の場合は次のようになります.

a = M(i, j); // read the component at row i and column j of M.
M(i, j) = b; //  write the component at row i and column j of M.

この場合も,行列がconst参照でない場合は,書き込みアクセスが可能です.一般に,特に疎行列の場合,このアクセスはあまり効率的ではありません.線形代数のプロシージャはイテレータを介してベクトルと行列の成分にアクセスします.( Gmm++ の深い内部 参照)

ベクトルや行列にオリジナルのコピー演算子を使用することも(全く)お勧めしません.一般的に,それは適切に動きません.代わりに,次のメソッドを使用する必要があります.

gmm::copy(V, W);  //  W <-- V

これは,たとえ VW と同じ型でなくても(たとえば, V は疎, W は密の場合),正しくインターフェイスされた行列とベクトル型のすべてに対して機能します.

Gmm++ では,ベクトルは(n×1)行列ではなく,1次元オブジェクトです.ベクトルを(n×1)列行列または(1×n)行行列として使用する必要がある場合は,次のようにします.

gmm::row_vector(V) // gives a reference on V considered as
                   // a (1 by n) row matrix
gmm::col_vector(V) // gives a reference on V considered as
                   // a (n by 1) col matrix

以下では,テンプレートパラメータ T は, doublestd::complex<double> のようなスカラー型を表します.

密ベクトル

Gmm++std::vector1<T> をインターフェイスするので,基本的な密ベクトル型として使うことができます.別の型の密なベクトルをインタフェースする必要がある場合は, gmm/gmm_interface.h のいくつか例をを参照してください.

疎ベクトル

Gmm++ には, gmm::wsvector<T>gmm::rsvector<T> という2種類の疎ベクトルがあります. gmm::wsvector<T> は書き込み操作用に最適化されており, gmm::rsvector<T> は読み込み操作用に最適化されています.アセンブル手順には gmm::wsvector<T> を使用し,ソルバーには gmm::rsvector<T> でベクトルをコピーするのが適切です.これらの2つのベクトル型は,行優先行列または列優先行列( 包括的な行と列の行列 を参照)を作成するために使用できます.

スカイラインベクトル

gmm::slvector<T> は,スカイラインベクトルを定義します.これは,このベクトルの間隔だけが格納されるという意味です.このタイプのベクトルを使うと,スカイライン行列を gmm::row_matrix< gmm::slvector<T> > (次の節 包括的な行と列の行列 を参照)として構築することができます.

包括的な行と列の行列

Gmm++gmm::row_matrix<VECT>gmm::col_matrix<VECT> の2つの型の行列を提供します.ここで VECT は有効な(すなわち,インターフェイス)ベクトル型であるべきです.この2種類の行列は VECT の配列を格納するため,メモリは連続していません.初期化は次のとおりです.

gmm::row_matrix< std::vector<double> > M1(10, 10);  // dense row matrix
gmm::col_matrix< gmm::wsvector<double> > M2(5, 20); // sparse column matrix

もちろん gmm::row_matrix<VECT> は行行列であり,この行列の特定の列にアクセスすることはできません.

gmm::mat_nrows(M) は行列の行数を表し, gmm::mat_ncols(M) は列数を表します.

密行列

次の型を使用することをお勧めします.

gmm::dense_matrix<T>

密行列型を表現するため,Fortran形式(列優先)と互換性があり,一部の演算がblasおよびLapack( BLAS,LAPACKまたはATLASのインターフェース を参照)とインタフェースされるためです.これは,列と行の行列(行優先)と見なされ,列と行の両方にアクセスできます.

しかし, gmm::row_matrix< std::vector<double> >gmm::col_matrix< std::vector<double> > などの行列型も密行列を表します.

疎行列

同様に, gmm::row_matrix< gmm::wsvector<double> >gmm::col_matrix< gmm::rsvector<double> > はいくつかの疎行列を表しますが, Gmm++ は古典的な疎行列の型を二つ提供します.

gmm::csr_matrix<T>
gmm::csc_matrix<T>

gmm::csr_matrix<T> は圧縮された行疎行列を表し, gmm::csc_matrix<T> は圧縮された列疎行列を表します.これら二つのタイプの行列の特殊性は,特定のコンポーネントにアクセスして書き込むことがでない(操作が拡張しすぎている)という意味で,読み出し専用です.許可されている書き込み操作は gmm::copy だけです.これらの行列を使う正しい方法は,まず gmm::row_matrix< gmm::wsvector<double> > のような別の型の行列に対して書き込み操作を実行し,それからコピーを行うことです.

gmm::row_matrix< gmm::wsvector<double> > M1;
...
assembly operation on M1
...
M1(i,j) = b;
...
gmm::csc_matrix<double> M2;
gmm::clean(M1, 1E-12);
gmm::copy(M1, M2);

行列 gmm::csr_matrix<T>gmm::csc_matrix<T> は,標準形式(Fortranコードとのインターフェースが可能)と(メモリ内で連続な)コンパクトフォーマットを持つ利点があります.Fortranプログラムとの互換性を確保するために,これらの型に2番目のテンプレートパラメータが存在する場合,次のように宣言できます.

gmm::csc_matrix<double, 1> M1;
gmm::csr_matrix<double, 1> M2;

1 はすべてのインデックスがシフトされることを意味します.