Skip to content

Instantly share code, notes, and snippets.

@komasaru
Created November 8, 2022 06:39
Show Gist options
  • Save komasaru/a4fd96522d8580738f81cebb36cc4bfe to your computer and use it in GitHub Desktop.
Save komasaru/a4fd96522d8580738f81cebb36cc4bfe to your computer and use it in GitHub Desktop.
C++ source code to test C++ matrix library Eigen.
/***********************************************************
C++ 行列ライブラリ Eigen のテスト
* 様々な定義、宣言、計算方法を試行
* ベクトルの変数は英小文字、行列の変数は英大文字としている
DATE AUTHOR VERSION
2022.10.20 mk-mode.com 1.00 新規作成
Copyright(C) 2022 mk-mode.com All Rights Reserved.
***********************************************************/
#include <cstdlib> // for EXIT_XXXX
#include <iostream>
//#include <Eigen/Dense> // 対応するヘッダを個別に include するのが面倒な場合
#include <Eigen/Core> // 基本的な行列定義・行列演算
#include <Eigen/Eigenvalues> // 固有値・固有ベクトル計算 etc. (外積)
int main(int argc, char* argv[]) {
// 定義
Eigen::Vector3d a; // 3 次元ベクトル(double) a 用
Eigen::VectorXd b(3); // 3 次元ベクトル(double) b 用
Eigen::Vector3d c; // 3 次元ベクトル(double) c 用
Eigen::Vector3d d; // 3 次元ベクトル(double) d 用
Eigen::Vector3d e; // 3 次元ベクトル(double) e (単位ベクトル)用
Eigen::Vector3d z; // 3 次元ベクトル(double) z (全てゼロ)用
Eigen::Matrix3d A; // 3 x 3 行列(double) a 用
Eigen::MatrixXd B(3, 3); // 3 x 3 行列(double) b 用
Eigen::Matrix3d E; // 3 x 3 行列(double) e (単位ベクトル)用
Eigen::Matrix3d Z; // 3 x 3 行列(double) z (全てゼロ)用
try {
// 初期化(英小文字の変数はベクトル、英大文字の変数は行列)
a << 1.2, -2.3, 3.4;
b(0) = -4.5;
b(1) = 5.6;
b(2) = -6.7;
c << 8.0, 3.0, 4.0;
d << 7.0, 5.0, 2.0;
e = Eigen::Vector3d::Identity();
z = Eigen::Vector3d::Zero();
A << -1.2, 2.3, -3.4,
4.5, -5.6, 6.7,
-7.8, 8.9, -9.0;
B(0, 0) = 9.0;
B(0, 1) = -8.7;
B(0, 2) = 7.6;
B(1, 0) = -6.5;
B(1, 1) = 5.4;
B(1, 2) = -4.3;
B(2, 0) = 3.2;
B(2, 1) = -2.1;
B(2, 2) = 1.0;
E = Eigen::Matrix3d::Identity();
Z = Eigen::Matrix3d::Zero();
std::cout << "a =" << std::endl
<< a << std::endl;
std::cout << "b =" << std::endl
<< b << std::endl;
std::cout << "c =" << std::endl
<< c << std::endl;
std::cout << "d =" << std::endl
<< d << std::endl;
std::cout << "e =" << std::endl
<< e << std::endl;
std::cout << "z =" << std::endl
<< z << std::endl;
std::cout << "A =" << std::endl
<< A << std::endl;
std::cout << "B =" << std::endl
<< B << std::endl;
std::cout << "E =" << std::endl
<< E << std::endl;
std::cout << "Z =" << std::endl
<< Z << std::endl;
std::cout << "---" << std::endl;
// 計算・出力 - ベクトル
std::cout << "a^T = " << a.transpose() << std::endl; // 転置
std::cout << "a = " << std::endl
<< a.head(3) << std::endl; // 先頭から3要素
std::cout << " = " << std::endl
<< a.tail(3) << std::endl; // 末尾から3要素
std::cout << "a(1) = " << a.segment(1, 1) << std::endl; // 第2要素から1要素
std::cout << "b(0) = " << b(0) << std::endl; // 第1要素
std::cout << "b(1) = " << b(1) << std::endl; // 第2要素
std::cout << "b(2) = " << b(2) << std::endl; // 第3要素
std::cout << "a.dot(b) =" << a.dot(b) << std::endl; // 内積
std::cout << "c.cross(d) =" << std::endl
<< c.cross(d) << std::endl; // 外積
std::cout << "a.norm() = " << a.norm() << std::endl; // ノルム
std::cout << "sqrt(a) = " << std::endl
<< a.array().sqrt() << std::endl; // √ベクトル
std::cout << "sum(a) = " << std::endl
<< a.sum() << std::endl; // 総和
std::cout << "mean(a) = " << std::endl
<< a.mean() << std::endl; // 平均値
std::cout << "min(a) = " << std::endl
<< a.minCoeff() << std::endl; // 最小値
std::cout << "max(a) = " << std::endl
<< a.maxCoeff() << std::endl; // 最大値
std::cout << "a + b =" << std::endl
<< a + b << std::endl; // ベクトル + ベクトル
std::cout << "a - b =" << std::endl
<< a - b << std::endl; // ベクトル - ベクトル
std::cout << "a * 3 =" << std::endl
<< a * 3 << std::endl; // ベクトル * スカラ
std::cout << "b / 2 =" << std::endl
<< b / 2 << std::endl; // ベクトル / スカラ
// +, -, *, / は代入演算子 +=, -=, *=, /= も使用可
std::cout << "---" << std::endl;
// 計算・出力 - 行列
std::cout << "A^T = " << std::endl
<< A.transpose() << std::endl; // 転置
std::cout << "A(0, *) = " << std::endl
<< A.row(0) << std::endl; // 1行目
std::cout << "A(*, 1) = " << std::endl
<< A.col(1) << std::endl; // 2列目
std::cout << "A(0-1, *) = " << std::endl
<< A.topRows(2) << std::endl; // 上から2行
std::cout << "A(1-2, *) = " << std::endl
<< A.bottomRows(2) << std::endl; // 下から2行
std::cout << "A(*, 0-1) = " << std::endl
<< A.leftCols(2) << std::endl; // 左から2列
std::cout << "A(*, 1-2) = " << std::endl
<< A.rightCols(2) << std::endl; // 右から2列
std::cout << "A(1, *) = " << std::endl
<< A.middleRows(1, 1) << std::endl; // 2行目から1行
std::cout << "A(*, 1) = " << std::endl
<< A.middleCols(1, 1) << std::endl; // 2列目から1列
std::cout << "A(1, 1) = " << std::endl
<< A.block(2, 1, 1, 1) << std::endl; // 3行目から1行、2列目から1列
std::cout << "A.inverse = " << std::endl
<< A.inverse() << std::endl; // 逆行列
std::cout << "sqrt(A) = " << std::endl
<< A.array().sqrt() << std::endl; // √行列
std::cout << "sum(A) = " << std::endl
<< A.sum() << std::endl; // 総和
std::cout << "mean(A) = " << std::endl
<< A.mean() << std::endl; // 平均値
std::cout << "min(A) = " << std::endl
<< A.minCoeff() << std::endl; // 最小値
std::cout << "max(A) = " << std::endl
<< A.maxCoeff() << std::endl; // 最大値
// 行/列毎に総和、平均/最小/最大値を算出する場合は、
// A.rowwise()..., A.colwise()... とする
std::cout << "A + B =" << std::endl
<< A + B << std::endl; // 行列 + 行列
std::cout << "A - B =" << std::endl
<< A - B << std::endl; // 行列 - 行列
std::cout << "A * B =" << std::endl
<< A * B << std::endl; // 行列 * 行列
std::cout << "A * 3 =" << std::endl
<< A * 3 << std::endl; // 行列 * スカラ
std::cout << "B / 2 =" << std::endl
<< B / 2 << std::endl; // 行列 / スカラ
// +, -, *, / は代入演算子 +=, -=, *=, /= も使用可
std::cout << "det(A) = " << A.determinant() << std::endl; // 行列式
// 計算・出力 - ベクトルと行列
std::cout << "A * b =" << std::endl
<< A * b << std::endl; // 行列 * ベクトル
std::cout << "a^T * B =" << std::endl
<< a.transpose() * B << std::endl; // ベクトル転置 * 行列 => ベクトル転置
std::cout << "a * b^T =" << std::endl
<< a * b.transpose() << std::endl; // ベクトル * ベクトル転置 => 行列
std::cout << "A(*, 0) * B(1, *) =" << std::endl
<< A.col(0) * B.row(1) << std::endl; // 行列1列目 * 行列2行目 => 行列
} catch (...) {
std::cerr << "EXCEPTION!" << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment