最終更新: 2013/9/17

ublasの使い方


1 概要

boostライブリに含まれるublasは、行列計算を行うテンプレートライブラリである。 行列やベクトルの各要素はテンプレートになっており、doubleや floatばかりでなくintervalを入れたり、自作の型を入れることも出来る。 自動微分などの特殊な型を使うことが多い非線形計算の精度保証には うってつけのライブラリであると言える。

なお、blasという名前から高速に動作するようなイメージを持つかも 知れないが、blasと同等のインターフェースを持つという意味で ublasと名付けられており、特に高速なわけではない (自分でforループを回して書いたプログラムと同程度)。

2 使い方

詳細は Boost Library Documentation の中の ublasの項を参照のこと。 日本語の解説も参考になるかも。 boost::numeric::ublas 線形代数ライブラリの使い方 も大変参考になる。

なお、STLの一部としてstd::vectorが存在するため、 using namespace std;している場合などに boost::numeric::ublas::vectorと衝突してエラーになりやすい (test-ublas2.cc)。 test-ublas3.ccのように ublasのvectorは明示的に指定することにしてusing namespaceに頼らないのが 安全かも知れない。

3 マクロNDEBUGについて

ublasではExpression Templateと呼ばれる技法を用い、 余分な一時変数を作成しないことで高速化を図っている。 但し、この機能はコンパイル時に -DNDEBUGを付けて NDEBUGマクロを定義した場合のみ有効になる。 NDEBUGはC++においてrelease版(debug版で無い)を makeする場合に付加するマクロとして一般的であり、実際Visual C++で release版としてbuildすると自動的にこのマクロが付加される。

なお、ublasでは、NDEBUGマクロが定義されていない場合は 配列の添字溢れのチェックが行われるが、NDEBUGを定義すると チェックが省かれて高速化されるようになっている。