車輪の再発明、もとい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)にも対応してみました。
コメント
コメントする
- 匿名でのコメントは受け付けておりません。
- お名前(ハンドル名可)とメールアドレスは必ず入力してください。
- メールアドレスを表示されたくないときはURLも必ず記入してください。
- コメント欄でHTMLタグは使用できません。
- コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
- コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。
- 投稿ボタンを押してエラーがでなければ、投稿は成功しています。反映されるまでには少し時間がかかります。