五流!!日曜プログラマーのつどい - boost::ublas メモ

まとまったら,さらに整理する予定


使用上の注意

気づいたこと,どんどん書き込んでみよう
 
プログラム例で using などを使って省略しているところがありますが,全て書くのが面倒かつ見づらくなるのであえて使っています.実際に使う際は using ディレクティブは使わない方が吉です.

ublas::メモ


積 ublas::prod
内積 ublas::inner_prod
直積 ublas::outer_prod
外積 存在しない

使える行列

型名説明#include
matrix普通の行列
zero_matrix零行列
identity_matrix単位行列
symmetric_matrix対称行列
banded_matrix帯行列
diagonal_matrix対角行列(帯行列の一部として実装されている. upper = 0, lower = 0)boost/numeric/ublas/banded.hpp
sparse_matrix疎行列(wiki)()

簡単な使い方( 初期化編 )
 namespace ublas = boost::numeric::ublas;

 ublas::matrix<double> m0(3,3);
 ublas::matrix<double> m1( 3,3,0);                                         //3*3行列 で 0で埋まっている
 ublas::matrix<double> m2( ublas::identity_matrix<double>(3,3));  //単位行列で初期化
他にも宣言の仕方がありそう -> 要研究

ublas/matrix_proxy.hpp

部分行列を取ってくるときに使える。

以下のプログラムはうろ覚え、デバックして確かめてない。
ublas::colum -> 列を取ってくる。その列にベクトルを代入することも可能
 using namespace boost::numeric::ublas;
 vector<double> v0(3), v1;
 matrix<double> m(3,3);
 
 colum(m,0) = v0;// mの0列目にvを代入
 v1 = colum(m,1) // vにmの1列目を代入
ublas::row -> 行について上と同じ。

matの部分行列を取る
 ublas::project( mat, ublas::range( 0, 2), ublas::range(0,2));
これで 00-11 の部分行列が取れる.range( 開始位置, 終了位置).(1,2)なら第1行(列)目のみを取ってくる
rangeを使わなくてもsliceで同様の実装ができる。

ublas/vector_proxy.hpp

vectorに関しては大概のものが行列と同じやり方で部分vectorが取れる.

using namespace boost::numeric::ublas;
void hoge( vector<double> v){
 vector_range< vector<double>> rv( v, range(0,3));
}
rvはvの要素0〜2までのイテレータ?が入ったベクトルができる この変数の値を変更すると元のベクトルの値も変化するので気をつけよう

constがついた場合は次のようになる
void hoge( const ublas::vector<double> v){
	// 要素aから要素b-1まで格納される
	const ublas::vector_range<const ublas::vector<double>> rv( v, ublas::range( a, b));
}