C++線形代数ライブラリEigen備忘録 

#C++線形代数ライブラリEigen備忘録 

##Eigenとは
　行列演算ができるC++標準ライブラリ。以下のページから最新のライブラリが入手でき、ヘッダーに追加するだけで使うことができる。-fopenmpオプションをつけるだけで並列処理もできるらしい。

http://eigen.tuxfamily.org/index.php?title=Main_Page

[Eigen quick reference](https://eigen.tuxfamily.org/dox/group__QuickRefPage.html)

##行列演算
　ベクトルや行列は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文で回しても値の初期化ができる。

```C++
#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備忘録。