のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Boost::ublas(1) 四則演算とmatrix,vector型のアクセスについて

Sponsored Links

皆さんこんにちわ。
お元気ですか?私はXORを学習するニューラルネットワークが完成して満足です。

さて、本日はublasについて
ublasとは行列演算を行うboostに付属しているライブラリです。
つまり、boostをインストールすれば使えます。

行列演算が多くなる機械学習とかを実装するには非常に便利になるライブラリです。
そんなboostの使い方、
今回はmatrix、vectorへの要素アクセス,変数の代入と単純な四則演算の計算について見ていきましょう

要素アクセスと代入

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

using namespace boost::numeric::ublas;

int main(void){
	matrix<double> mat(3,4); //3行4列
	vector<double> vect(4); //4次元ベクトル

	std::cout << mat << std::endl;
	std::cout << vect << std::endl;
	mat(1,2) = 100; //1行目の2列目
	mat(2,3) = 200; //2行目の3列目
	vect(1) = 30;
	vect(0) = 20;
	std::cout << mat << std::endl;
	std::cout << vect << std::endl;
}

mat型は(行、列)と指定して値を代入しています。
vector型はstd::vectorとは別なので、混同しないように気をつける必要があります。

[3,4]((0,0,0,0),(0,0,0,0),(0,0,0,0))
[4](0,0,0,0)
[3,4]((0,0,0,0),(0,0,100,0),(0,0,0,200))
[4](20,30,0,0)

四則演算

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

using namespace boost::numeric::ublas;

int main(void){
	//初期化
	matrix<double> mat1(2,2);
	mat1(0,0) = 2.0; mat1(0,1) = 1.0;
	mat1(1,0) = 3.0; mat1(1,1) = 4.0;

	matrix<double> mat2(2,2);
	mat2(0,0) = 4.0; mat2(0,1) = 3.0;
	mat2(1,0) = 2.0; mat2(1,1) = 1.0;

	vector<double> vec1(2);
	vec1(0) = 2.0; vec1(1) = 3.0;

	vector<double> vec2(2);
	vec2(0) = 4.0; vec2(1) = 5.0;
	//一応
	std::cout << "行列の内容を出力" << std::endl;
	std::cout << mat1 << std::endl;
	std::cout << mat2 << std::endl;
	std::cout << vec1 << std::endl;
	std::cout << vec2 << std::endl;

	//和
	std::cout << "和" << std::endl;
	std::cout << mat1 + mat2 << std::endl;
	std::cout << vec1 + vec2 << std::endl;

	//差
	std::cout << "差" << std::endl;
	std::cout << mat1 - mat2 << std::endl;
	std::cout << vec1 - vec2 << std::endl;
	//積
	std::cout << "積" << std::endl;
	std::cout << prod(mat1,mat2) << std::endl;
	//定数倍
	std::cout << "定数倍" << std::endl;
	std::cout << 5 * mat1 << std::endl;
	
	std::cout << "定数で割る" << std::endl;
	std::cout << mat1 / 5 << std::endl;
}

うん、特にありませんね。

行列の内容を出力
[2,2]((2,1),(3,4))
[2,2]((4,3),(2,1))
[2](2,3)
[2](4,5)[2,2]((6,4),(5,5))
[2](6,8)[2,2]((-2,-2),(1,3))
[2](-2,-2)[2,2]((10,7),(20,13))
定数倍
[2,2]((10,5),(15,20))
定数で割る
[2,2]((0.4,0.2),(0.6,0.8))

次回はもう少し複雑なことをやりたいと思います。