この文書は,線形演算ライブラリ boost::numeric::ublas の使い方の一部を簡単に説明したものです.
どうも boost ― uBLAS については日本語の説明書きがないようです.頼みの日本語解説書[2]も uBLAS はたった 2 ページ.Web をあさっても私の希望にあう解説は見あたりません.仕方がないので英語のオリジナルドキュメントと格闘しました.その結果,なんとか連立1次方程式を解くことと,逆行列を求めることはできるようになったので,私と同じようなお悩みを抱えて Web を巡回中のあなたに私のメモ書きを公開することにしました.
ここで説明する ublas は,Boost C++ Library の一部です.Boost は膨大な数の C++ ライブラリの集合体です.非常にパワフルかつフリーです.あなたもぜひ Boost にハマってください(笑).日本語の解説書も出ています(こちらを参照).全てのライブラリを網羅とまではいきませんが,あなたの Boost ライフをハッピーにすること間違いなしです.内容の割にお値段も 2,800 円と手頃なため,是非手元に置いておくことをおすすめします.
メリットは大きく三つあります.
第一に,計算が高速らしいことです.これは expression template(下注) という C++ の高度なテクニックによるものです[2]p.353.
第二に,様々なタイプの行列やベクトルに適したクラスが定義されていることです.行列のほとんどの要素がゼロである行列は「疎行列」と呼ばれますが,このような行列の場合は値が 0 でない要素の分だけメモリを確保すれば十分です.また,対称行列やエルミート行列では,( i , j ) 要素の値は ( j , i ) 要素を見ることで簡単に分かりますから,まともに全要素分のメモリを確保するとその約半分は無駄になります.boost::numeric::ublas では,これらの行列に対する適切な内部表現を持ったクラスが提供されています.
第三に,ライセンスが極めて緩いものになっていることです.Boost は誰でも自由に無料で使用できます.Boost を使用して制作したソフトウェアも全く自由に配布でき,GPL のようにソースコードの公開義務もありません.バイナリを配布するときは著作権表示すら必要ないという自由さです.このようにもともと広く使われる素地を持っていることから,将来的にデファクトスタンダードとなることが期待されます.
expression template 技法
偉そうに注を付けていますが,実は私はこのテクニックについて何も知りません.文献[2]によれば,expression template とは,「式の情報ををテンプレートの構造として保持する」ような技法らしいです.
筆者が理解している範囲で具体例を示しますが,あくまで私の理解を文章にしただけなので,間違っている可能性があります.ご了解の上お読みください.
例えば行列 A と B があって,prod(A,B)+Aと書いたとしても,実は A・B + A はすぐには計算されず,この式は「A と B を掛けて A を足した」という情報を示す型のオブジェクトを返します.ここで,別な行列オブジェクト C を用意し,C = prod(A,B)+Aとすると,代入演算子が実行される段階で初めて掛け算と足し算が発生するそうです.それも,「まず掛け算をやって,その結果に足し算をする」のではなく,同時に処理してしまうらしいです.
つまり,実際の計算を本当にその値が必要になるときまで遅らせることができるということです.また,演算のたびに発生する一時オブジェクトが不要になることもあり,高速化が期待できるとされています(筆者注).これ以上の詳しい説明は私の脳味噌には期待しないでください(笑).詳しく知りたい方はググるなり本(日本語の本はまだないそうですが)を買うなりして調べてください.
(筆者注) これは行列演算に限っては逆に遅くなる可能性もあるような…
既に Boost がインストール済みであることを前提とします.Boost のインストール方法はこちら[3].
この文書の記述は,Boost バージョン 1.32.0 に基づいています.
この説明する全てのクラスは,特記以外 boost::numeric::ublas 名前空間で定義されています.また,ヘッダファイルをインクルードする必要がある場合は,その旨記載します.