#C++線形代数ライブラリEigen備忘録
##Eigenとは
行列演算ができるC++標準ライブラリ。以下のページから最新のライブラリが入手でき、ヘッダーに追加するだけで使うことができる。-fopenmpオプションをつけるだけで並列処理もできるらしい。
##行列演算
ベクトルや行列はVectorXdやMatrixXdで宣言する。末尾のXdはX次元のdouble型を意味する。宣言時にXを数字で次元を固定してもいいし、Xにしてかっこ内で次元を決めてもよい。型はi,d,f,b,cd,cfが選べる。すべての要素を0で作るZero(d,d)やOnes(d,d)、Constant(d,d)、Random(d,d)、Identity(d,d)などがある。標準出力はstd::coutでできる。
既に宣言したMatrixの値をある値で初期化したい場合は、.block(0,0,d,d)で全部の要素を指定して、Constant(d, d, 0)で整数値を入れ込む。行列のサイズの取得は.size()、.rows()、cols()。列と行の長さでfor文で回しても値の初期化ができる。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cmath>
#include <math.h>
#include <Eigen/Dense>
using namespace Eigen;
int main(void){
//次元値
int d = 3;
//宣言方法
Matrix<int, 2, 3> mat;
Matrix<bool, 2, 3> bool_mat;
Matrix3i int_mat;
Matrix3f float_mat;
Matrix3d double_mat;
Matrix<int,Dynamic,Dynamic> dynamic;
typedef Matrix<int, 5, 1> Vector5i;
typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
//初期化
MatrixXd m1 = MatrixXd::Zero(d, d);
MatrixXd m2 = MatrixXd::Ones(d, d);
MatrixXd m3 = MatrixXd::Constant(d, d, 1.0);
MatrixXd m4 = MatrixXd::Random(d, d);
MatrixXd m5 = MatrixXd::Identity(d, d);
//MatrixXd M51 = m5.transposeInPlace();
//MatrixXd M52 = m5.adjointInPlace();
std::cout << "------------------------------------------------" << std::endl;
std::cout << m1 << std::endl;
//値を初期化
m1.block(0,0,d,d) = MatrixXd::Constant(d, d, 0);
std::cout << "------------------------------------------------" << std::endl;
std::cout << m1 << std::endl;
//コピー
MatrixXd tmp1 = m1;
m1.swap(tmp1);
//サイズやリサイズ
m1.size();
m1.rows();
m1.cols();
m1.resize(3,3);
//ある行、列のみ抽出
VectorXd vec1 = m1.col(2);
VectorXd vec2 = m1.row(2);
MatrixXd block_m1 = m1.block(0,0,1,1);
std::cout << "------------------------------------------------" << std::endl;
std::cout << vec1 << std::endl;
//boolで判定
std::cout << (m1.array()>1.0).all() << std::endl;
std::cout << (m1.array()>1.0).any() << std::endl;
std::cout << (m1.array()<1.0).count() << std::endl;
//部分的に値変更
m1(0,0) = 3;
m1(0,1) = 2.5;
m1(1,0) = -1;
for(int i=0;i<m1.cols();++i){
for(int j=0;j<m1.rows();++j) m1(i,j)=i*0.1+j*0.6;
}
m1 << 1,2,3,
4,5,6,
7,8,9;
std::cout << "------------------------------------------------" << std::endl;
std::cout << m1 << std::endl;
//各値へ演算子をかける
MatrixXd M1 = m1.cwiseInverse();
MatrixXd M2 = m1.cwiseAbs();
MatrixXd M3 = m1.cwiseAbs2();
MatrixXd M4 = m1.cwiseSqrt();
MatrixXd M5 = m1.cwiseMin(m2);
MatrixXd M6 = m1.cwiseMax(m2);
MatrixXd M7 = m1.cwiseProduct(m2);
MatrixXd M8 = m1.cwiseQuotient(m2);
std::cout << "------------------------------------------------" << std::endl;
std::cout << M1 << std::endl;
//Vector宣言
VectorXd v1 = VectorXd::LinSpaced(10, 0, 10);
v1.head(1);
v1.tail(1);
v1.segment(1, 1);
v1.tail(1);
}
##まとめ
C++線形代数ライブラリEigen備忘録。