基本的な線形代数の演算

基本的な操作を演算子としてではなく関数として提供するという,MTLと同じ選択をしています.この利点は,プログラム内の線形代数演算がどこにあるのかが分かりやすくなり,最適化された基本線形演算のプログラミングが大幅に簡素化されることです.

scaleとscaled

gmm::scale は,ベクトルまたは行列にスカラー因子を掛けるために使われます.

gmm::scale(V, 10.0);  // V * 10.0 ---> V

ベクトルを乗算する必要がなく,乗算されたベクトルを式 gmm::scaled で使用したい場合は,乗算されたベクトルへの参照を与えます.これは参照のみです.この参照がどこかで使用されるまで操作は行われません.例えば

std::cout << gmm::scaled(V, 10.0) << std::endl;

V を変更せずにベクトル V10.0 を掛けたベクトルを標準出力に出力します.

転置

gmm::transposed(M)M の転置された行列上に修正可能な参照を与えます.

虚部と実部

複合行列 M または複合ベクトル Vgmm::real_part(M)gmm::real_part(V)gmm::imag_part(M) または gmm::imag_part(V) は行列またはベクトルの実部または虚部に対する変更可能な参照を与えます(たとえば, gmm::clear(gmm::imag_part(M)) は行列 M の虚部を0に設定します.).これらの関数は実数の行列やベクトルには適用できません.

共役

行列 M またはベクトル V に対して, gmm::conjugated(M)gmm::conjugated(V) は共役ベクトルまたは行列の定数参照を与える.もちろん,実際のベクトルの場合,これは効果がありません(コストもかかりません).注: gmm::conjugated(M) は,行列 M のエルミート共役となるようにマトリックス M を転置します.各成分の共役のみが必要な場合は, gmm::conjugated(gmm::transposed(M)) または同等の gmm::transposed(gmm::conjugated(M)) で転置と共役の両方を使用する必要があります.

加算

ベクトルまたは行列の加算.異なる型のベクトルや行列を演算に混在させることも可能です.有効な操作は次のとおりです.

std::vector<double> V1(10);
gmm::wsvector<double> V2(10);
gmm::clear(V1);
...
gmm::add(V1, V2); // V1 + V2 --> V2
cout << gmm::vref(V2);

gmm::add(V1, gmm::scaled(V2, -2.0), V2); // V1 - 2.0 * V2 --> V2
cout << gmm::vref(V2);

gmm::row_matrix< std::vector<double> > M1(10, 10);
gmm::col_matrix< gmm::wsvector<double> > M2(1000, 1000);

// M1 + (sub matrix of M2) ---> (sub matrix of M2)
gmm::add(M1, gmm::sub_matrix(M2, gmm::sub_interval(4,10)));

重要:すべてのベクトルは同じサイズでなければなりません.サイズ変更は自動的には行われません.ベクトルのサイズが適切でない場合は,エラーが投げられます.

乗算

行列とベクトルまたは行列と行列乗算.ここでも,すべての行列とベクトルは適切なサイズでなければなりません.次の操作が有効です.

std::vector<double> V1(10);
gmm::wsvector<double> V2(10);
...
gmm::row_matrix< std::vector<double> > M1(10, 10);
...

gmm::mult(M1, V2, V1);  // M1 * V2 --> V1

gmm::mult(M1, V2, V2, V1);  // M1 * V2 + V2 --> V1

gmm::mult_add(M1, V2, V1);  // M1 * V2 + V1 --> V1

gmm::mult(M1, gmm::scaled(V2, -1.0), V2, V1);  // M1 * (-V2) + V2 --> V1

gmm::col_matrix< gmm::wsvector<double> > M2(10, 10);
gmm::col_matrix< gmm::vsvector<double> > M3(10, 10);
...

gmm::mult(M1, M2, M3); // M1 * M2 ---> M3

gmm::mult(gmm::sub_matrix(M1, sub_interval(0, 3)),
          gmm::sub_matrix(M2, sub_interval(4, 3)),
          gmm::sub_matrix(M3, sub_interval(2, 3)));

ノルム

gmm::vect_norm1(V)  // sum of the modulus of the components of vector V.
gmm::vect_norm2(V)  // Euclidean norm of vector V.
gmm::vect_dist2(V1, V2)  // Euclidean distance between V1 and V2.
gmm::vect_norminf(V)    // infinity norm of vector V.
gmm::mat_euclidean_norm(M) // Euclidean norm of matrix ``M``
                           // (called also Frobenius norm).
gmm::mat_maxnorm(M) // Max norm (defined as max(|m_ij|; i,j ))
gmm::mat_norm1(M)   // max(sum(|m_ij|, i), j)
gmm::mat_norminf(M) // max(sum(|m_ij|, j), i)

トレース

`gmm::mat_trace(M) は行列 M のトレースを返します.

スカラー積

ベクトルのみの場合, gmm::vect_sp(V1, V2)V1V2 の間のスカラ積を与えます.複雑なベクトルの場合,これは V1 と共役しません. gmm::vect_sp(V1, gmm::conjugated(V2)) または gmm::vect_hp(V1, V2) を使用することができ,この2つは同等です.