車輪の再発明、もといmatrix.hの更新

行列演算を使うことが多いため、勉強がてら自作のC++行列ライブラリ matrix.hを作っています。このたびUnscented Kalman Filterを実装する必要があり(kalman.h)、そこで使う行列のsqrt(平方根)を取れるようにしましたので、お知らせしておこうと思います。いわゆる『車輪の再発明』ですが、プログラムを常に書いていないと忘れてしまう体質なので、リハビリの一環ということで自己満足しています。

自作ライブラリということで怪しさ満点なのですが、たとえエラー処理がへたれていても(笑)、計算の正しさは確保したいので、検証を行いました。方法は以前の記事『SWIGによる行列/複素数 C++ライブラリのRubyへの移植』と同じで、SWIGでラップ、Rubyからライブラリを呼び出せるようにして、RubyのMatrixライブラリによる計算と比較を行ってみました。FenrirMathTest.rbがテストケースですが、今回追加したsqrtを含めて全てクリアしているようです。コンパイル方法などは、前述の記事をご参考にしてください。

この検証作業をするにあたって、はじめ何も考えず適当にラッパー生成ジェネレータSWIGに通したところ、コンパイルエラーがでました。行列の成分が複素数の場合(Matrix<Complex<FloatT> >)に、固有値を求めるeigenや平方根を求めるsqrtで文句を言われます。しかしSWIGは賢く、関数のラッピング禁止(%ignoreというキーワードで指定できます)をテンプレートの特殊化においても正しく理解してくれるので、%extend Matrix<Complex<FloatT> > { %ignore eigen; }で華麗に解決することができました。このあたりの格闘をSWIGインターフェイスファイル FenrirMath.iに見ていただけると嬉しい(笑)です。

※その後、裏側でGNU Scientific Library (GSL)にも対応してみました。

January 14, 2009 01:53 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

コメントする