大前提
これらの機能を使う際は、以下のインクルードを忘れないようにしましょう。
#include <Eigen/Dense>
ベクトル
宣言
1. 基本
Eigen::Vector<型名, 次元数>と宣言します。//int型で3次元のベクトル Eigen::Vector<int, 3> intVect3; //double型で2次元のベクトル Eigen::Vector<double, 2> doubleVect2;
2. 少し発展的なもの
int型の2次元ベクトルなどのクラスは既定のものが存在します。代表的なものを表に示しますが、公式サイトに書かれているのでそちらも参考にしてみてください(Eigen: Global matrix typedefs)。
クラス名 | 機能 | Eigen::Vector<型名, 次元数>で示した場合 |
---|---|---|
Eigen::Vector3i | 3次元のint型 | Eigen::Vector<int, 3> |
Eigen::Vector2d | 2次元のdouble型 | Eigen::Vector<double, 2> |
//int型で3次元のベクトル Eigen::Vector3i intVect3; //double型で2次元のベクトル Eigen::Vector2d doubleVect2;
初期化
宣言と同時に初期化
//int型で3次元のベクトル Eigen::Vector3i intVect3(1, 2, 3); std::cout << intVect3 << std::endl; //double型で2次元のベクトル Eigen::Vector2d doubleVect2(1.1, -1.5); std::cout << doubleVect2 << std::endl;
実行結果
1 2 3 1.1 -1.5
変化形
//int型で3次元のベクトル Eigen::Vector3i intVect3; intVect3 << 1, 2, 3; std::cout << intVect3 << std::endl;
実行結果
1 2 3
大きさの取得
変数名.size()で次元数(要素数)を取得できます。
Eigen::Vector3i intVect3(1, 2, 3); std::cout << intVect3.size() << std::endl;
実行結果
3
要素へのアクセスと変更
std::vectorのように変数名(n)でn次元目(n番目)の要素にアクセスできます。
Eigen::Vector3i intVect3(1, 2, 3); std::cout << intVect3(2) << std::endl; intVect3(2) = 5; std::cout << intVect3(2) << std::endl; }
実行結果
3 5
演算(加算、減算、乗算、内積)
#include <iostream> #include <Eigen/Dense> int main() { Eigen::Vector3i v1(1, 3, 4); Eigen::Vector3i v2(-1, 2, 2); std::cout << "加算\n" << v1 + v2 << "\n" << std::endl; std::cout << "減算\n" << v1 - v2 << "\n" << std::endl; std::cout << "乗算\n" << 4 * v2 << "\n" << std::endl; std::cout << "内積\n" << v1.dot(v2) << "\n" << std::endl; }
実行結果
加算 0 5 6 減算 2 1 2 乗算 -4 8 8 内積 13
行列
宣言
基本
//2行2列のint型 Eigen::Matrix<int, 2, 2> m1; //3行2列のdouble型 Eigen::Matrix<double, 3, 2> m2;
簡略化した書き方
//2行2列のint型 Eigen::Matrix2i m1; //3行3列のdouble型 Eigen::Matrix3d m2;
初期化
#include <iostream> #include <Eigen/Dense> int main() { //2行2列のint型 Eigen::Matrix2i m1; m1 << 1, 2, 3, 4; std::cout << m1 << std::endl; }
実行結果
1 2 3 4
要素へのアクセスと変更
2次元配列のように変数名(n, m)でn行m列目の値にアクセスできます(0から始まる点に注意)。
#include <iostream> #include <Eigen/Dense> int main() { Eigen::Matrix2i m1; m1 << 1, 2, 3, 4; //2行2列目に存在する要素を書き換え m1(1, 1) = 0; //1行、2列目に存在する要素の書き換え m1(0, 1) = -5; std::cout << m1 << std::endl; }
実行結果
1 -5 3 0
行数、列数の取得
- 行数:変数名.rows()
- 列数:変数名.colss()
で取得できます。
#include <iostream> #include <Eigen/Dense> int main() { Eigen::Matrix<int, 2, 3> m1; m1 << 1, 2, 3, 4, 5, 6; std::cout << m1.rows() << "行" << m1.cols() << "列" << std::endl; }
実行結果
2行3列
加算、減算、積、乗算
#include <iostream> #include <Eigen/Dense> int main() { Eigen::Matrix2i m1, m2; m1 << 1, 2, 3, 4; m2 << -1, 2, 3, 0; std::cout << "加算\n" << m1 + m2 << "\n" << std::endl; std::cout << "減算\n" << m1 - m2 << "\n" << std::endl; std::cout << "積\n" << m1 * m2 << "\n" << std::endl; std::cout << "積算\n" << 2 * m1 << "\n" << std::endl; }
実行結果
加算 0 4 6 4 減算 2 0 0 4 積 5 2 9 6 積算 2 4 6 8
転置と逆行列
#include <iostream> #include <Eigen/Dense> int main() { //2行2列のdouble型 Eigen::Matrix<double, 2, 2> m1; m1 << 1, 2, 3, 4; std::cout << "転置行列\n" << m1.transpose() << "\n" << std::endl; std::cout << "逆行列\n" << m1.inverse() << "\n" << std::endl; }
実行結果
転置行列 1 3 2 4 逆行列 -2 1 1.5 -0.5
行列とベクトルの積
行列とベクトルの積を求めるプログラムは次のようになります
#include <iostream> #include <Eigen/Dense> int main(){ //行列Aの宣言と初期化 Eigen::Matrix2i a; a << 1, 2, 3, 4; //ベクトルxの宣言と初期化 Eigen::Vector2i x(2, 3); //y=Axの計算 Eigen::Vector2i y = a * x; //表示 std::cout << x << std::endl; }
実行結果
8 18