January 14, 2009

車輪の再発明、もとい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)にも対応してみました。

01:53 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/683
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。