Created
November 8, 2022 06:39
-
-
Save komasaru/a4fd96522d8580738f81cebb36cc4bfe to your computer and use it in GitHub Desktop.
C++ source code to test C++ matrix library Eigen.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*********************************************************** | |
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