今回はEigenのリファレンスを参照してMatrixクラスの初期化方法についてまとめました。
1. Matrixクラス
Matrixクラスは行列を格納するためのクラスで、クラステンプレートとして以下のように定義されています。
class Eigen::Matrix <class Scalar_, int Rows_, int Cols_, int Options_, int MaxRows_, int MaxCols_>
| 引数 | 内容 |
|---|---|
| Scalar_ | 型(int, float, doubleなど) |
| Rows_ | 行数(-1で動的サイズ) |
| Cols_ | 列数(-1で動的サイズ) |
| Options_ | オプション |
| MaxRows_ | 最大行数 |
| MaxCols_ | 最大列数 |
・Scalar
型を指定する。対応している型は
int
float
double
Eigen::scomplex(std::complex<float>)
Eigen::dcomplex(std::complex<double>)
の5種類です。
・Rows_, Cols_
行列の行数と列数を設定する。
1以上で固定サイズ、-1で動的サイズとなる。
おおよそ4×4未満の行列の場合は固定サイズにした方がパフォーマンスが向上する。
・Options_
行列をメモリに格納する際の順番を指定するオプション
例えば下記の行列の場合それぞれ以下のような順番でメモリに格納される。
\[a=\begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ \end{pmatrix}\]
ColMajor = [1,4,7,2,5,8,3,6,9]
RowMajor = [1,2,3,4,5,6,7,8,9]
・MaxRows_, MaxCols_
動的サイズでも行列の最大値がわかっている場合にあらかじめ設定しておくことができ、MaxRows_×MaxCols_の配列として使用できる。
基本的にはScalar_(型)とRows_(行数)、Cols_(列数)の3項目を設定すれば問題ないと思います。
例えば3×3の行列をint型で定義する場合は
Eigen::Matrix<int, 3, 3> mat;
4×2の行列をfloat型で定義する場合は
Eigen::Matrix<float, 4, 2> mat;
動的サイズの行列をdouble型で定義する場合は
Eigen::Matrix<double, -1, -1> mat;
となります。
2. Matrixの定義
2×2~4×4までの正方行列(固定サイズ)と動的サイズのMatrixクラスはtypedefで定義されているのでこちらを使ったほうが便利です。
なお、typedefを使用する場合はOptions_, MaxRows_, MaxCols_はデフォルトとなります。
2.1. int型Matrixの定義
| テンプレート | typedef | 内容 |
|---|---|---|
| Eigen::Matrix<int, 2, 2> | Eigen::Matrix2i | 2×2の行列 |
| Eigen::Matrix<int, 3, 3> | Eigen::Matrix3i | 3×3の行列 |
| Eigen::Matrix<int, 4, 4> | Eigen::Matrix4i | 4×4の行列 |
| Eigen::Matrix<int, 2, -1> | Eigen::Matrix2Xi | 2×Nの行列 |
| Eigen::Matrix<int, 3, -1> | Eigen::Matrix3Xi | 3×Nの行列 |
| Eigen::Matrix<int, 4, -1> | Eigen::Matrix4Xi | 4×Nの行列 |
| Eigen::Matrix<int, -1, 2> | Eigen::MatrixX2i | N×2の行列 |
| Eigen::Matrix<int, -1, 3> | Eigen::MatrixX3i | N×3の行列 |
| Eigen::Matrix<int, -1, 4> | Eigen::MatrixX4i | N×4の行列 |
| Eigen::Matrix<int, -1, -1> | Eigen::MatrixXi | N×Nの行列 |
2.2. float型Matrixの定義
| テンプレート | typedef | 内容 |
|---|---|---|
| Eigen::Matrix<float, 2, 2> | Eigen::Matrix2f | 2×2の行列 |
| Eigen::Matrix<float, 3, 3> | Eigen::Matrix3f | 3×3の行列 |
| Eigen::Matrix<float, 4, 4> | Eigen::Matrix4f | 4×4の行列 |
| Eigen::Matrix<float, 2, -1> | Eigen::Matrix2Xf | 2×Nの行列 |
| Eigen::Matrix<float, 3, -1> | Eigen::Matrix3Xf | 3×Nの行列 |
| Eigen::Matrix<float, 4, -1> | Eigen::Matrix4Xf | 4×Nの行列 |
| Eigen::Matrix<float, -1, 2> | Eigen::MatrixX2f | N×2の行列 |
| Eigen::Matrix<float, -1, 3> | Eigen::MatrixX3f | N×3の行列 |
| Eigen::Matrix<float, -1, 4> | Eigen::MatrixX4f | N×4の行列 |
| Eigen::Matrix<float, -1, -1> | Eigen::MatrixXf | N×Nの行列 |
2.3. double型Matrixの定義
| テンプレート | typedef | 内容 |
|---|---|---|
| Eigen::Matrix<double, 2, 2> | Eigen::Matrix2d | 2×2の行列 |
| Eigen::Matrix<double, 3, 3> | Eigen::Matrix3d | 3×3の行列 |
| Eigen::Matrix<double, 4, 4> | Eigen::Matrix4d | 4×4の行列 |
| Eigen::Matrix<double, 2, -1> | Eigen::Matrix2Xd | 2×Nの行列 |
| Eigen::Matrix<double, 3, -1> | Eigen::Matrix3Xd | 3×Nの行列 |
| Eigen::Matrix<double, 4, -1> | Eigen::Matrix4Xd | 4×Nの行列 |
| Eigen::Matrix<double, -1, 2> | Eigen::MatrixX2d | N×2の行列 |
| Eigen::Matrix<double, -1, 3> | Eigen::MatrixX3d | N×3の行列 |
| Eigen::Matrix<double, -1, 4> | Eigen::MatrixX4d | N×4の行列 |
| Eigen::Matrix<double, -1, -1> | Eigen::MatrixXd | N×Nの行列 |
2.4. Eigen::scomplex(std::complex)型Matrixの定義
| テンプレート | typedef | 内容 |
|---|---|---|
| Eigen::Matrix<Eigen::scomplex, 2, 2> | Eigen::Matrix2cf | 2×2の行列 |
| Eigen::Matrix<Eigen::scomplex, 3, 3> | Eigen::Matrix3cf | 3×3の行列 |
| Eigen::Matrix<Eigen::scomplex, 4, 4> | Eigen::Matrix4cf | 4×4の行列 |
| Eigen::Matrix<Eigen::scomplex, 2, -1> | Eigen::Matrix2Xcf | 2×Nの行列 |
| Eigen::Matrix<Eigen::scomplex, 3, -1> | Eigen::Matrix3Xcf | 3×Nの行列 |
| Eigen::Matrix<Eigen::scomplex, 4, -1> | Eigen::Matrix4Xcf | 4×Nの行列 |
| Eigen::Matrix<Eigen::scomplex, -1, 2> | Eigen::MatrixX2cf | N×2の行列 |
| Eigen::Matrix<Eigen::scomplex, -1, 3> | Eigen::MatrixX3cf | N×3の行列 |
| Eigen::Matrix<Eigen::scomplex, -1, 4> | Eigen::MatrixX4cf | N×4の行列 |
| Eigen::Matrix<Eigen::scomplex, -1, -1> | Eigen::MatrixXcf | N×Nの行列 |
2.5. Eigen::dcomplex(std::complex)型Matrix定義
| テンプレート | typedef | 内容 |
|---|---|---|
| Eigen::Matrix<Eigen::dcomplex, 2, 2> | Eigen::Matrix2cd | 2×2の行列 |
| Eigen::Matrix<Eigen::dcomplex, 3, 3> | Eigen::Matrix3cd | 3×3の行列 |
| Eigen::Matrix<Eigen::dcomplex, 4, 4> | Eigen::Matrix4cd | 4×4の行列 |
| Eigen::Matrix<Eigen::dcomplex, 2, -1> | Eigen::Matrix2Xcd | 2×Nの行列 |
| Eigen::Matrix<Eigen::dcomplex, 3, -1> | Eigen::Matrix3Xcd | 3×Nの行列 |
| Eigen::Matrix<Eigen::dcomplex, 4, -1> | Eigen::Matrix4Xcd | 4×Nの行列 |
| Eigen::Matrix<Eigen::dcomplex, -1, 2> | Eigen::MatrixX2cd | N×2の行列 |
| Eigen::Matrix<Eigen::dcomplex, -1, 3> | Eigen::MatrixX3cd | N×3の行列 |
| Eigen::Matrix<Eigen::dcomplex, -1, 4> | Eigen::MatrixX4cd | N×4の行列 |
| Eigen::Matrix<Eigen::dcomplex, -1, -1> | Eigen::MatrixXcd | N×Nの行列 |
3. Vectorの定義
行または列の数が1の場合はVectorとして定義されています。 VectorもMatrixクラスであり、typedefでそれぞれ以下のように定義されています。
3.1. int型Vectorの定義
| テンプレート | typedef | 内容 |
|---|---|---|
| Eigen::Matrix<int, 2, 1> | Eigen::Vector2i | 2×1の列ベクトル |
| Eigen::Matrix<int, 3, 1> | Eigen::Vector3i | 3×1の列ベクトル |
| Eigen::Matrix<int, 4, 1> | Eigen::Vector4i | 4×1の列ベクトル |
| Eigen::Matrix<int, 1, 2> | Eigen::RowVector2i | 1×2の列ベクトル |
| Eigen::Matrix<int, 1, 3> | Eigen::RowVector3i | 1×3の列ベクトル |
| Eigen::Matrix<int, 1, 4> | Eigen::RowVector4i | 1×4の列ベクトル |
| Eigen::Matrix<int, -1, 1> | Eigen::Vector2i | N×1の列ベクトル |
| Eigen::Matrix<int, 1, -1> | Eigen::RowVectorXi | 1×Nの列ベクトル |
3.2. float型Vectorの定義
| テンプレート | typedef | 内容 |
|---|---|---|
| Eigen::Matrix<float, 2, 1> | Eigen::Vector2f | 2×1の列ベクトル |
| Eigen::Matrix<float, 3, 1> | Eigen::Vector3f | 3×1の列ベクトル |
| Eigen::Matrix<float, 4, 1> | Eigen::Vector4f | 4×1の列ベクトル |
| Eigen::Matrix<float, 1, 2> | Eigen::RowVector2f | 1×2の列ベクトル |
| Eigen::Matrix<float, 1, 3> | Eigen::RowVector3f | 1×3の列ベクトル |
| Eigen::Matrix<float, 1, 4> | Eigen::RowVector4f | 1×4の列ベクトル |
| Eigen::Matrix<float, -1, 1> | Eigen::Vector2f | N×1の列ベクトル |
| Eigen::Matrix<float, 1, -1> | Eigen::RowVectorXf | 1×Nの列ベクトル |
3.3. double型Vectorの定義
| テンプレート | typedef | 内容 |
|---|---|---|
| Eigen::Matrix<double, 2, 1> | Eigen::Vector2d | 2×1の列ベクトル |
| Eigen::Matrix<double, 3, 1> | Eigen::Vector3d | 3×1の列ベクトル |
| Eigen::Matrix<double, 4, 1> | Eigen::Vector4d | 4×1の列ベクトル |
| Eigen::Matrix<double, 1, 2> | Eigen::RowVector2d | 1×2の列ベクトル |
| Eigen::Matrix<double, 1, 3> | Eigen::RowVector3d | 1×3の列ベクトル |
| Eigen::Matrix<double, 1, 4> | Eigen::RowVector4d | 1×4の列ベクトル |
| Eigen::Matrix<double, -1, 1> | Eigen::Vector2d | N×1の列ベクトル |
| Eigen::Matrix<double, 1, -1> | Eigen::RowVectorXd | 1×Nの列ベクトル |
3.4. Eigen::scomplex(std::complex)型Vectorの定義
| テンプレート | typedef | 内容 |
|---|---|---|
| Eigen::Matrix<Eigen::scomplex, 2, 1> | Eigen::Vector2cf | 2×1の列ベクトル |
| Eigen::Matrix<Eigen::scomplex, 3, 1> | Eigen::Vector3cf | 3×1の列ベクトル |
| Eigen::Matrix<Eigen::scomplex, 4, 1> | Eigen::Vector4cf | 4×1の列ベクトル |
| Eigen::Matrix<Eigen::scomplex, 1, 2> | Eigen::RowVector2cf | 1×2の列ベクトル |
| Eigen::Matrix<Eigen::scomplex, 1, 3> | Eigen::RowVector3cf | 1×3の列ベクトル |
| Eigen::Matrix<Eigen::scomplex, 1, 4> | Eigen::RowVector4cf | 1×4の列ベクトル |
| Eigen::Matrix<Eigen::scomplex, -1, 1> | Eigen::Vector2cf | N×1の列ベクトル |
| Eigen::Matrix<Eigen::scomplex, 1, -1> | Eigen::RowVectorXcf | 1×Nの列ベクトル |
3.5. Eigen::dcomplex(std::complex)型Vector定義
| テンプレート | typedef | 内容 |
|---|---|---|
| Eigen::Matrix<Eigen::dcomplex, 2, 1> | Eigen::Vector2cd | 2×1の列ベクトル |
| Eigen::Matrix<Eigen::dcomplex, 3, 1> | Eigen::Vector3cd | 3×1の列ベクトル |
| Eigen::Matrix<Eigen::dcomplex, 4, 1> | Eigen::Vector4cd | 4×1の列ベクトル |
| Eigen::Matrix<Eigen::dcomplex, 1, 2> | Eigen::RowVector2cd | 1×2の列ベクトル |
| Eigen::Matrix<Eigen::dcomplex, 1, 3> | Eigen::RowVector3cd | 1×3の列ベクトル |
| Eigen::Matrix<Eigen::dcomplex, 1, 4> | Eigen::RowVector4cd | 1×4の列ベクトル |
| Eigen::Matrix<Eigen::dcomplex, -1, 1> | Eigen::Vector2cd | N×1の列ベクトル |
| Eigen::Matrix<Eigen::dcomplex, 1, -1> | Eigen::RowVectorXcd | 1×Nの列ベクトル |
4. 初期化
Matrixクラスの初期化についていくつか例を記載します。
4.1. 係数初期化
行列またはベクトルを定義する際、任意の値を渡す。
Eigen::Vector3i vec3i{ 1,2,3 };
// 動的サイズの場合は2重かっこ
Eigen::RowVectorXi rowvecXi{ {1,2,3} };
// 行列の場合は行ごとにかっこでくくる
Eigen::Matrix3i mat3i{
{1,2,3},
{4,5,6},
{7,8,9}
};
Eigen::MatrixXi matXi{
{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12}
};
std::cout << "vec3i = \n" << vec3i << std::endl;
std::cout << "rowvecXi = \n" << rowvecXi << std::endl;
std::cout << "mat3i = \n" << mat3i << std::endl;
std::cout << "matXi = \n" << matXi << std::endl;
実行結果はこちら。

行列またはベクトルを定義した後各要素に直接値を設定する。
// 2×2行列
Eigen::Matrix2i mat2i;
Eigen::MatrixXi mat2iN(2,2);
mat2i(0, 0) = 1;
mat2i(1, 0) = 2;
mat2i(0, 1) = 3;
mat2i(1, 1) = 4;
mat2iN(0, 0) = 1;
mat2iN(1, 0) = 2;
mat2iN(0, 1) = 3;
mat2iN(1, 1) = 4;
std::cout << "mat2i = \n" << mat2i << std::endl;
std::cout << "mat2iN = \n" << mat2iN << std::endl;
実行結果はこちら。

4.2. カンマ区切りで初期化
カンマ区切りのリストを<<シフト演算子で設定することもできます。 ただし、Matrixクラスのサイズはあらかじめ設定しておきリストのサイズも合わせる必要があります。
Eigen::MatrixXd matXd(3,3);
matXd << 1.1, 2.2, 3.3,
4.4, 5.5, 6.6,
7.7, 8.8, 9.9;
std::cout << "matXd = \n" << matXd << std::endl;
実行結果はこちら。

4.3. Zeroで初期化
任意のサイズを設定し、すべて0で初期化する。
Eigen::MatrixXi matXi = Eigen::MatrixXi::Zero(4,4);
std::cout << "matXi = \n" << matXi << std::endl;
実行結果はこちら。

4.4. Onesで初期化
任意のサイズを設定し、すべて1で初期化する。
Eigen::MatrixXi matXi = Eigen::MatrixXi::Ones(4, 4);
Eigen::MatrixXi matXi_10 = Eigen::MatrixXi::Ones(4, 4) * 10;
std::cout << "matXi = \n" << matXi << std::endl;
std::cout << "matXi_10 = \n" << matXi_10 << std::endl;
実行結果はこちら。

4.5. Identityで初期化
任意のサイズを設定し、単位行列で初期化する。
Eigen::MatrixXi matXi = Eigen::MatrixXi::Identity(4,4);
std::cout << matXi << std::endl;
実行結果はこちら。

4.6. Ramdomで初期化
任意のサイズを設定し、ランダムな値で初期化する。
Eigen::MatrixXd matXd = Eigen::MatrixXd::Random(4, 4);
std::cout << "matXd = \n" << matXd << std::endl;
実行結果はこちら。

今回は以上です。
5. 参考文献
・Eigenリファレンス
https://eigen.tuxfamily.org/dox/group__TutorialMatrixClass.html




コメント