<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