読者です 読者をやめる 読者になる 読者になる

C++ の行列演算ライブラリ

こんにちは.このブログでは主に Boost.uBLAS と Boost.Bindings, lapack(clapack) というライブラリを用いた行列計算のライブラリの構築手順と,その実装例を紹介していこうと思います.
C++ には uBLAS という有名な行列計算を行うライブラリがあり,基本的な行列,ベクトル計算(加算,減算,乗算,内積等)はすべてこのライブラリで計算することができます.
uBLAS は boost と呼ばれるライブラリのコンポーネントで,一部を除いてヘッダファイルをダウンロードしてコンパイラのパスを通すだけ(つまり include するだけ)で使えるためとても導入しやすいライブラリで(もちろん,本ブログで用いる uBLAS, Bindings もヘッダファイルをダウンロードし,include するだけで使用できます),かつ C++ のエキスパートによって設計された間違いなく C++ で最も洗練された行列ライブラリの一つです.

lapackFORTRAN という言語で記述された線形代数ライブラリで,uBLAS では計算できない特異値分解(SVD),スペクトル分解(固有値分解),LU分解,QR分解,最小二乗法などを高速かつ正確に計算することができるライブラリで,間違いなく世界最高の線形代数ライブラリです(かの有名な MATLAB もこのライブラリを使用しています).clapack はこの lapack を f2c によりC言語に変換したものです.

つまり,この二つのライブラリを用いれば C++ という環境において世界最高峰の線形代数プログラムを作成できます.そして,この二つのライブラリを C++ という構造化された環境で用いる為のアダプタとなるライブラリが Boost.Bindings です.

しかし,以上のような世界最高峰の線形代数演算環境を構築するための部品(uBLAS, lapack, bindings)が揃っているにも関わらず,それらをどう組み合わせて実装すればよいのかという説明書に当たる情報は,今現在残念ながらあまりないようです.そこで,本ブログではこの説明書に当たる情報を実際のコード例を通して紹介していこうと思います.

また,私の uBLAS に対する最大の不満,つまりトレース(trace)や外積(Cross product)が実装されていない問題についても対処しましたので,lapack は使わないが uBLAS は使うという方も是非ご覧下さい(欠けている機能をすべて遅延評価で実装しました).

最後に,適当に boost, uBLAS のページを紹介をしておこうと思います.
boost に含まれているライブラリ全体の説明は Let's Boost が圧倒的にすばらしいです.boost のインストール方法についても詳細に書かれています.
uBLAS についてはboost::numeric::ublas 線形代数ライブラリの使い方が非常によいです.ここを一通り読めば uBLAS の主要な機能を一通り知ることができると思います.
uBLAS でできる基本的な演算については Overview of Matrix and Vector Operations によくまとまっています.
余力か暇がある人には

もいいかもしれません.特に,Visual C++ 使いは Effective UBLAS の Debugging in Visual Studio に目を通しておくとよいでしょう.


次回からコード例やその説明を紹介していきますが,自由に改変・使用してもらってかまいませんので,どうかよろしくお願いいたします.
また,lapack に処理を投げるだけの単純なプログラムや,ちょっとだけ複雑なプログラム,あるいはプログラム中,説明文中に M や N などの記号が入り乱れていてちょっと怪しげに見えるコード例を見て,本ブログに載っているコードや説明が本当に正しいのか疑問に思う方もいらっしゃると思いますが,説明文は何度も読み直し,コードは実際にコンパイルし,できるだけ多様な入力を与え結果をチェックしていますので,どうかご安心ください.
それでももし万が一間違いを見つけられた場合には,連絡してもらえると幸いです.
それではまた.