<Blitz++>

公式
Documentation より Example Programs の方が頼りになる。

Blitz++はC++の数値計算用ライブラリ。
Debian/Ubuntuなら、ふつーにapt-getできる。
コンパイル時は -lblitz を付ける。

Arrayクラスは、型と階数を指定できる一般ベクトルクラス。

例:

#inclide <blitz/array.h>

using namespace blitz;

Array<double,2> Matrix(2,2); //各要素がdoubleの2×2の正方行列(2階テンソル)。

この行列同士の乗算をやってみる。
行列同士の乗算:

Array<double,2> A(2,2), B(2,2), C(2,2); //このあと適当に初期化
firstIndex i; secondIndex j; thirdIndex k; //添字に使う文字を指定する

C = sum(A(i,k) * B(k,j), k); //第二引数でダミーインデックスを指定
12/24 嘘書いてたのを修正

ちょっと注意:調子こいて4階テンソルからベクトルへ一気に縮約しようとしたらsegfaultになった。
4階あたりから中間変数(2〜3階あたりのテンソル)が必要になるみたい。
ちゃんとメモリを確保してやれば済む話かもしれないが、勉強するのが面倒なので取り敢えずこの手でしのぐ。

>>ランクの下げ方

たとえば、3階テンソルは1階テンソル(=ベクトル)の各要素が同サイズの2階テンソル(=行列)であるようなものと考えることができる。 ここで、後者(2階テンソル)のうちの1つを取り出したくなった時、blitz++のテンソルでは次のようなことを行う。

blitz::firstIndex  i;
blitz::secondIndex j;
blitz::thirdIndex  k;

blitz::Array<int,3> Parrent(3,3,3);
Parrent = i+j+k; //Parrent(i,j,k)=i+j+k,の意。

blitz::Array<int,2> Child(3,3);
Child = Parent(0,blitz::Range::all(),blitz::Range::all());
//Parentのうち{i=0,j=すべて、k=すべて}の成分を取り出す。これは3×3行列になる。

これをSlicingと言うそうな。
Rangeという見慣れないものが出てきたが、これは「範囲」を表す概念。
Range::all()は文字通り「全範囲」を表している。Range(0,2)とやれば添字0から2までを表す。

accend->labnote->index page