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

opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

Boostで行列の計算 その1

Boost C++ 行列 数学

ということで、その1ということでBoostのuBLASを使って行列の計算をしようという話。

その前に...

本題の前にいくつか書きたいことがあるので書いておくよ。

まず、その1と称しているけどその2が来るのか来ないのかわからない...あと来たとして次はいつになるのかわからない。

で、なんで突然こんなことをしだしたかというと、暇だったからなのと興味があったからなのは当然そうなんだけど、おいらは某工業大学の1年生で、線形代数なる科目があるわけでそれがまあ...やばい感がすると。
そういうわけで線形代数の勉強も兼ねてということで。

参考サイト

http://www.boost.org/doc/libs/1_53_0/libs/numeric/ublas/doc/index.htm
http://www.page.sannet.ne.jp/d_takahashi/boost/ublas/

今回すること

main.cppからBoostの行列ライブラリを使ってみること。 で、使ったら好きな行列を定義して、加減してみたり積を取ってみたりする。

それだけ。

main.cppを書く

ヘッダーファイルについて

まず、必要なheader fileは

#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

とりあえず今回はこの2つ。他にも色々あるっぽいけど、足し算引き算掛け算ではこの2つあればなんとかなるらしい。


行列の宣言について

行列を扱う変数を定義する

matrix<int> A(2,2); //2×2の正方行列 (要素はint型)
matrix<double> B(2,1); //2×1の行列 (要素はdobule型)

という感じで定義する。行列は英語でMatrixだからね。


要素へのアクセスと初期化

とりあえず

matrix<int> A(2,2);

というふうに宣言したとして。 Aの(i,j)要素にアクセスしたいときは

A(i,j)

でいいみたい。 参考サイトにはA[i][j]でもおkと書いていたのでやってみたけど、こちらはエラーが出てしまう。バージョンの誤差なのかおいらが何か間違えて書いてたのかはわからないけど、とりあえずA(i,j)で今後アクセスしていくことにしてみた。

で、初期化する。ループで回して初期化してもいいけど、今回は単純に2×2だけなので1つずつ初期化していく。

A(0,0) = 1; A(0,1) = 0;
A(1,0) = 0; A(1,1) = 1;

と、例えばこんな感じ。これで2×2の単位行列になる。

※ちなみに、行列を定義した時点でその要素は0で初期化されているようだ。


行列を表示してみる

行列をcoutで表示するためには"boost/numeric/ublas/io.hpp"が必要らしい。 これをincludeしたら、普通に以下のようにして表示できる。

std::cout<<"A = "<<A<<std::endl;

で、これを実行すると例えば以下のような出力が返る。

A = [2,2]((1,0),(0,1))

見方としては、[2,2]はn×mの行列であることを示している。[n,m]で今回n = 2,m = 2なので[2,2]となっている。 次が要素で、左のカッコから1行目、2行目...と続く。(1,0)が1行目で(0,1)が2行目。


足し算引き算と定数倍

足し算引き算定数倍は簡単で...

A + B

とか

A - C

とか

3 * A

とかで単純にできる。


行列どうしの積について

例えばA,Bという行列の積を計算させるときは

prod(A,B);

という感じでprod関数を使うといいらしい。答えは戻り値として返る。


ということでmain.cppを適当に書いてみた

f:id:opamp_sando:20130417203048p:plain

という感じ。 (Markdown記法でのC++コードの色付けとかの仕方がまだわかってないので今回は久しぶりに画像で勘弁... 次までに調べておきます)

で、実行結果は

A = [2,2]((0,0),(1,1))
B = [2,2]((0,0),(1,0))
A + B = [2,2]((0,0),(2,1))
A - B = [2,2]((0,0),(0,1))
5A = [2,2]((0,0),(5,5))
3B = [2,2]((0,0),(3,0))
C = AB = [2,2]((0,0),(1,0))

あってるかな?

終わり

ということで、ほとんど上の参考記事を丸パクリしただけだったけどその1は終了。 今後その2、その3...とかで線形代数で習ったことを実際にやっていこうかなーって計画中。

ということで今日はこのへんで ノシ

Firefox ブラウザ無料ダウンロード