boost::numeric::ublas

トップページ > 数学 >

abstract

必要なヘッダ
<boost/numeric/ublas/vector.hpp>, (ベクトル)
<boost/numeric/ublas/matrix.hpp>, (行列)
<boost/numeric/ublas/io.hpp>, (入出力)
<boost/numeric/ublas/***.hpp>, 他必要に応じて色々
出来ること
線形代数の計算
リファレンス
en

sample

#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 であると。

etc

ベクトルと行列の、足し算引き算に内積とか外積とか長さ計算とか回転とか、 線形方程式を解くとかその辺りの計算用のライブラリです。 この手のライブラリでは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] )することにすれば、テンポラリが不要になるという寸法。

see also

presented by k.inaba (kiki .a.t. kmonos.net) under CC0