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

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

Boost::ublas(3) ゼロ行列、単位行列、対称行列、密行列、対角行列

Sponsored Links

皆さんこんにちわ。
お元気ですか?

実は通常のmatrix以外にも色々なmatrixを構成することができます。
今回はそれらのご紹介です。今回紹介するのは以下の5種類。

ゼロ行列 zero_matrix ゼロ埋めされている行列
単位行列 identity_matrix 対角成分が1の行列
対称行列 symmetric_matrix 転置前と転置後の行列が等しい
密行列 banded_matrix 0が少ない行列らしい…。すみません、微妙です
対角行列 diagonal_matrix 対角成分以外は0

実際に使ってみましょう

ソースコード

#include <iostream>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/lu.hpp>
#include <boost/numeric/ublas/triangular.hpp>
#include <boost/numeric/ublas/banded.hpp>
#include <boost/numeric/ublas/symmetric.hpp>

using namespace boost::numeric;
using namespace std;

int main(int argc, char const *argv[])
{
	ublas::matrix<double> mat0(3,3);
	ublas::zero_matrix<double> mat1(3,3);
	ublas::identity_matrix<double> mat2(3,3);
	ublas::symmetric_matrix<double> mat3(3,3);
	ublas::banded_matrix<double> mat4(4,5);
	ublas::diagonal_matrix<double> mat5(3,3);

	//対称行列の初期化
	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 3; j++){
			mat3(i,j) = j;
		}
	}
	//密行列の初期化
	mat4(0,0) = 100; mat4(1,1) = 200; mat4(2,2) = 150; mat4(3,3) = 200;

	//対角行列の初期化
	mat5(0,0) = 100; mat5(1,1) = 200; mat5(2,2) = 300;

	//全ての行列を出力
	cout << mat0 << endl;
	cout << mat1 << endl;
	cout << mat2 << endl;
	cout << mat3 << endl;
	cout << mat4 << endl;
	cout << mat5 << endl;

	return 0;
}

出力

[3,3]((0,0,0),(0,0,0),(0,0,0))
[3,3]((0,0,0),(0,0,0),(0,0,0))
[3,3]((1,0,0),(0,1,0),(0,0,1))
[3,3]((0,0,0),(0,1,1),(0,1,2))
[4,5]((100,0,0,0,0),(0,200,0,0,0),(0,0,150,0,0),(0,0,0,200,0))
[3,3]((100,0,0),(0,200,0),(0,0,300))

解説

まず、
zero_matrix,identity_matrixは変更を加えようとすると以下のようなエラーメッセージがわいてくる。

error: read-only variable is not assignable

symmetri_matrixは対称行列でない値を入れると自動的に内容が調整されてる可能性があります。
少なくとも入力と出力が今回、一致していません。

banded_matrix,diagonal_matrixは入れてはいけない値を入れるとエラーを吐きます。

libc++abi.dylib: terminating with uncaught exception of type boost::numeric::ublas::bad_index: bad index
Abort trap: 6

感想

うん、なんか色々と複雑ですが、書き方次第でコード書く上でミスをなくすことができますね。