部分ベクトルと部分行列

完全にインタフェースされたオブジェクトの任意の部分ベクトルまたは部分行列を得ることができます.次の4種類の部分インデックスがあります.

gmm::sub_interval(first, length);

これは,最初のインデックスが first で,長さが length である間隔を表します (例えば gmm::sub_interval(10, 3); はインデックス {10, 11, 12} を表します.) .

gmm::sub_slice(first, length, step);

は, step よりも1つ多いインデックスが取られる間隔を表します.(例えば gmm::sub_slice(10, 3, 2);{10, 12, 14} を表します.)

gmm::sub_index(CONT c);

これは,コンテナ c に含まれるインデックスの集合である部分インデックスを表します.例えば

std::vector<size_t> c(3);
c[0] = 1; c[1] = 3; c[2] = 16;
gmm::sub_index(c);

インデックス {1, 3, 16} を表します.

非常に重要 : コンテナ c は小さいインデックスから大きいインデックス(つまり,次数の増加する方向)に ソート されなければならず,繰り返しは許されません.

置換などのソートされていないインデックスの場合,特殊なタイプのサブインデックスが定義されます.

gmm::unsorted_sub_index(CONT c);

一部のアルゴリズムでは,ソートされていないサブインデックスを使用すると少し遅くなります.

ここで gmm::sub_vector(V, subi) は部分ベクトルへの参照を与えます.

gmm::vsvector<double> V(10);
V[5] = 3.0;
std::cout << gmm::sub_vector(V, gmm::sub_interval(2, 3)) << std::endl;

これにより標準出力に V[2], V[3]V[4] を出力します.

gmm::sub_matrix(V, subi1, subi2) は部分行列を参照します.例えば

gmm::col_matrix< gmm::wsvector<double> > M(5, 20);
M(3, 2) = 5.0;
std::cout << gmm::sub_matrix(M, gmm::sub_interval(2, 3), gmm::sub_interval(2, 3))
          << std::endl;

は部分行列を出力します.2つの部分インデックスが等しい場合は,2番目の部分インデックスを省略できます.例えば

gmm::col_matrix< gmm::wsvector<double> > M(5, 20);
M(3, 2) = 5.0;
std::cout << gmm::sub_matrix(V, gmm::sub_interval(2, 3)) << std::endl;

sub_matrixの参照は,対応する行列が書き込み可能(sub_matrixにコピーしたり,部分行列を追加したりすることができる)の場合に書き込み可能です.

行列の行と列

gmm::mat_row(M, i) は行列Mの行iを(書き込み可能で)参照し, gmm::mat_col(M, i) は列iを(書き込み可能で)参照します. M が列行列の場合は行に,行行列の場合は列にアクセスできません. gmm::mat_const_row(M, i)gmm::mat_const_col(M, i) を使って定数を参照することができます.