行列計算の高速化

行列計算を行なう必要性が微妙にあったのでライブラリを探してました。まあこのくらい自分で作ってもよいのですが車輪の再発明してもしょうがないので既存のを使うことにしました。ちなみに行列計算は演算子多重定義の練習にちょうどよいです。

んでまあ、仮にも元数値計算屋さん(今も?)なのだから一応いくつかは知っているわけで・・・有名どころはBlitz++とかboostに内包されているuBlasとかがあります。Blitz++は個人的に毛嫌いしている*1のでuBlasを使おうかと思ったらなんだかサンプルがうまく動かない(^^;
面倒なので別の奴に使用かと思ったらいいのがありました。tvmetというライブラリ。「Tiny Vector Matrixlibrary using Expression Template」という略で、まあとりあえず次元の小さい行列なら驚異的な速度がでますよというのが売りっぽい。というわけでこいつを使うことにしました。

ところで、このライブラリの名前の一部「Expression Template」ですが、これは行列みたいなデータのでかいもの同士の演算では定番の技みたいなのですが、簡単に言えば演算を演算の表現のままで取って置いて具体的データは必要になった際に演算するという方法です多分(ぉ 詳しくはこちらをどうぞ
http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html
んでもう一つ、このライブラリで利用しているのがTemplate Metaprograms C++のテンプレート展開を利用してコンパイル時に計算してしまうという方法。これがなかなか面白い(^^; この方法、やね本2で初めて知ったのですが当時は階乗計算をどうにかこうにか理解したのが限界。今やってみたら面白くてしょうがない。
http://osl.iu.edu/~tveldhui/papers/Template-Metaprograms/
しかし利用できるまでは遠そうだ。
とりあえず両方ともBlitz++の作者のページであることを読んでから気が付いたorz てことはBlitz++も当然この機能を使っているのか・・・。

*1:VisualStudioでコンパイルがわざわざ通らないように作ってある・・・と思われる