2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

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

Eigen quick reference

##行列演算
 ベクトルや行列は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備忘録。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?