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
感想
うん、なんか色々と複雑ですが、書き方次第でコード書く上でミスをなくすことができますね。