C++で使える線形代数ライブラリ

3Dゲームプログラミングにおいて線形代数の使用はもはや必須となりますが、基本的にOpenGLを使用した場合はDirectXのようにそこらへんをサポートしてくれるようなヘルパー関数はありません。なのでベクトルやマトリクス演算を行うためにはそれらを自作するか、サードパーティライブラリを使用するしかありません。という事で今回はC++で使えそうな線形代数ライブラリをまとめてみました。

Boost.uBLAS

いきなり本命。ご存知の通りBoostライブラリ上にてBLASで実装されているテンプレートライブラリ。C++を使って最新の機能でアルゴリズムを正しく実装している事に注力しているとか。STLイテレータインタフェースを備えていたり、かなり標準ライブラリとの親和性が強いのも特徴。ライセンスが多分最も緩く、使用する際にもBoostを入れるだけでいいので、導入は相当簡単。

Blitz++

C++の科学技術計算にFortran 77/90と同等のパフォーマンスを提供するクラスライブラリ。高いパフォーマンスを達成するためのテクニックのテンプレートを使用します。との事で科学技術計算の分野で強いFortran 77/90と同等のパフォーマンスらしいですが、実際どこまで速いのかはわかりません。ライセンスはGPLと独自ライセンスを選択出来るらしい。基本的な導入は簡単そうですが、情報が少ないので躓くと大変かも。

Eigen

今現在も絶賛進化中のC++クラスライブラリ。公式の謳い文句的には"多用途"、"高速"、"洗練されたAPI"などを掲げています。SSEなどベクトル演算が利用可能な場合は積極的に利用。不要な動的メモリ確保の除去、コスト評価した上でのループアンローリング、キャッシュ向けに最適化、とかなりの本気さが伺えます。特に問題がなければ選択肢として一番かも。ライセンスはGPL、もしくはLGPLとなるようです。

CPPLAPACK

一応国産らしいライブラリ。既存のFortran BLASLAPACK,CBLAS,CLAPACKなどのライブラリはインタフェースがユーザフレンドリーではないらしいので、あくまでもC++らしいライブラリとして書き直すという意味で開発されているらしい。あくまでも大規模行列の計算のためのライブラリらしく、そうでない場合の開発では他のライブラリを使う方がいいとの事。内部の実装はBLASらしいので、それなりに高速なはず。ライセンスは完全フリーで使用に対して無保証。

OpenGL Mathematics

OpenGL用に特化したライブラリ。GLSL 4.0の行列・ベクトル型に互換性を持っているらしい。速度的にどの程度速いかは謎。あまり詳しい事はわからないのですが、他ではあまり例をみないswizzle演算までサポートしているらしい。OpenGLのインタフェースとも相性がいいので、OpenGLでの開発を考えるのなら選択肢としてありかもしれません。私自身かなりこれに惹かれているところ。ライセンスはMITライセンス。導入はヘッダをインクルードするだけなのでかなり楽チンです。

*選択肢

使い勝手やライセンスを考えるとBoost.uBLASがよさそうです。しかし速度や実際最適化レベルでの問題を考えるとEigenには期待が出来そう。個人レベルでOpenGLを使うならGLMもありなんじゃないかと。私は今回GLMを選ぶ事になりそうです。まぁこの手のライブラリで一番大変なのは日本語関係のドキュメントがほぼないという事ですね。根性で英語を翻訳しながら読むしかなさそうです。