#include <iostream>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
int main()
{
using namespace boost::numeric::ublas;
// ベクトル (1, 2, 3)
vector<int> v( 3 );
for( int i=0; i!=3; ++i )
v( i ) = i+1;
// 行列 (1 2 3)
// (2 4 6)
// (3 6 9)
matrix<int> a( 3, 3 );
for( int i=0; i!=3; ++i )
for( int j=0; j!=3; ++j )
a( i, j ) = (i+1)*(j+1);
// a*vを表示
std::cout << prod(a,v) << std::endl;
return 0;
}
[3](14,28,42)
3次元ベクトルで、成分は順に 14, 28, 42 であると。
ベクトルと行列の、足し算引き算に内積とか外積とか長さ計算とか回転とか、 線形方程式を解くとかその辺りの計算用のライブラリです。 この手のライブラリではFortranで書かれた BLAS というものが事実上の標準らしく、 そのBLASが持っている関数は全て網羅されているようです。
実装のポイントとしては、C++上での計算ライブラリの必須テクニックである Expression Template という手法を用いて効率化を図った実装が用意されています。 Expression Template ってのは「式をそのまま式として」 関数の引数として渡したりする方法(この辺参照)なわけですが、それがどう効率化に繋がるかというと、 例えば 1000x1000 のデカい行列の計算をしたりするときに
B + C * D
素直に作ると、まず C * D を計算してそれを B に足すわけです。ここで C * D という 1000x1000 行列の分の一時領域が必要になっちゃったりします。 そこで、この式はB+C*Dという式( expression ) として覚えておいて、 実際に値が必要となった時に各要素の値をダイレクトに算出( B[i][j] + ΣC[i][k]・D[k][j] )することにすれば、テンポラリが不要になるという寸法。