スポンサーリンク

【C++】EigenのMatrixクラスの初期化方法

EigenのMatrixクラス初期化方法

今回は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::Matrix2i2×2の行列
Eigen::Matrix<int, 3, 3>Eigen::Matrix3i3×3の行列
Eigen::Matrix<int, 4, 4>Eigen::Matrix4i4×4の行列
Eigen::Matrix<int, 2, -1>Eigen::Matrix2Xi2×Nの行列
Eigen::Matrix<int, 3, -1>Eigen::Matrix3Xi3×Nの行列
Eigen::Matrix<int, 4, -1>Eigen::Matrix4Xi4×Nの行列
Eigen::Matrix<int, -1, 2>Eigen::MatrixX2iN×2の行列
Eigen::Matrix<int, -1, 3>Eigen::MatrixX3iN×3の行列
Eigen::Matrix<int, -1, 4>Eigen::MatrixX4iN×4の行列
Eigen::Matrix<int, -1, -1>Eigen::MatrixXiN×Nの行列

2.2. float型Matrixの定義

テンプレートtypedef内容
Eigen::Matrix<float, 2, 2>Eigen::Matrix2f2×2の行列
Eigen::Matrix<float, 3, 3>Eigen::Matrix3f3×3の行列
Eigen::Matrix<float, 4, 4>Eigen::Matrix4f4×4の行列
Eigen::Matrix<float, 2, -1>Eigen::Matrix2Xf2×Nの行列
Eigen::Matrix<float, 3, -1>Eigen::Matrix3Xf3×Nの行列
Eigen::Matrix<float, 4, -1>Eigen::Matrix4Xf4×Nの行列
Eigen::Matrix<float, -1, 2>Eigen::MatrixX2fN×2の行列
Eigen::Matrix<float, -1, 3>Eigen::MatrixX3fN×3の行列
Eigen::Matrix<float, -1, 4>Eigen::MatrixX4fN×4の行列
Eigen::Matrix<float, -1, -1>Eigen::MatrixXfN×Nの行列

2.3. double型Matrixの定義

テンプレートtypedef内容
Eigen::Matrix<double, 2, 2>Eigen::Matrix2d2×2の行列
Eigen::Matrix<double, 3, 3>Eigen::Matrix3d3×3の行列
Eigen::Matrix<double, 4, 4>Eigen::Matrix4d4×4の行列
Eigen::Matrix<double, 2, -1>Eigen::Matrix2Xd2×Nの行列
Eigen::Matrix<double, 3, -1>Eigen::Matrix3Xd3×Nの行列
Eigen::Matrix<double, 4, -1>Eigen::Matrix4Xd4×Nの行列
Eigen::Matrix<double, -1, 2>Eigen::MatrixX2dN×2の行列
Eigen::Matrix<double, -1, 3>Eigen::MatrixX3dN×3の行列
Eigen::Matrix<double, -1, 4>Eigen::MatrixX4dN×4の行列
Eigen::Matrix<double, -1, -1>Eigen::MatrixXdN×Nの行列

2.4. Eigen::scomplex(std::complex)型Matrixの定義

テンプレートtypedef内容
Eigen::Matrix<Eigen::scomplex, 2, 2>Eigen::Matrix2cf2×2の行列
Eigen::Matrix<Eigen::scomplex, 3, 3>Eigen::Matrix3cf3×3の行列
Eigen::Matrix<Eigen::scomplex, 4, 4>Eigen::Matrix4cf4×4の行列
Eigen::Matrix<Eigen::scomplex, 2, -1>Eigen::Matrix2Xcf2×Nの行列
Eigen::Matrix<Eigen::scomplex, 3, -1>Eigen::Matrix3Xcf3×Nの行列
Eigen::Matrix<Eigen::scomplex, 4, -1>Eigen::Matrix4Xcf4×Nの行列
Eigen::Matrix<Eigen::scomplex, -1, 2>Eigen::MatrixX2cfN×2の行列
Eigen::Matrix<Eigen::scomplex, -1, 3>Eigen::MatrixX3cfN×3の行列
Eigen::Matrix<Eigen::scomplex, -1, 4>Eigen::MatrixX4cfN×4の行列
Eigen::Matrix<Eigen::scomplex, -1, -1>Eigen::MatrixXcfN×Nの行列

2.5. Eigen::dcomplex(std::complex)型Matrix定義

テンプレートtypedef内容
Eigen::Matrix<Eigen::dcomplex, 2, 2>Eigen::Matrix2cd2×2の行列
Eigen::Matrix<Eigen::dcomplex, 3, 3>Eigen::Matrix3cd3×3の行列
Eigen::Matrix<Eigen::dcomplex, 4, 4>Eigen::Matrix4cd4×4の行列
Eigen::Matrix<Eigen::dcomplex, 2, -1>Eigen::Matrix2Xcd2×Nの行列
Eigen::Matrix<Eigen::dcomplex, 3, -1>Eigen::Matrix3Xcd3×Nの行列
Eigen::Matrix<Eigen::dcomplex, 4, -1>Eigen::Matrix4Xcd4×Nの行列
Eigen::Matrix<Eigen::dcomplex, -1, 2>Eigen::MatrixX2cdN×2の行列
Eigen::Matrix<Eigen::dcomplex, -1, 3>Eigen::MatrixX3cdN×3の行列
Eigen::Matrix<Eigen::dcomplex, -1, 4>Eigen::MatrixX4cdN×4の行列
Eigen::Matrix<Eigen::dcomplex, -1, -1>Eigen::MatrixXcdN×Nの行列

3. Vectorの定義

行または列の数が1の場合はVectorとして定義されています。 VectorもMatrixクラスであり、typedefでそれぞれ以下のように定義されています。

3.1. int型Vectorの定義

テンプレートtypedef内容
Eigen::Matrix<int, 2, 1>Eigen::Vector2i2×1の列ベクトル
Eigen::Matrix<int, 3, 1>Eigen::Vector3i3×1の列ベクトル
Eigen::Matrix<int, 4, 1>Eigen::Vector4i4×1の列ベクトル
Eigen::Matrix<int, 1, 2>Eigen::RowVector2i1×2の列ベクトル
Eigen::Matrix<int, 1, 3>Eigen::RowVector3i1×3の列ベクトル
Eigen::Matrix<int, 1, 4>Eigen::RowVector4i1×4の列ベクトル
Eigen::Matrix<int, -1, 1>Eigen::Vector2iN×1の列ベクトル
Eigen::Matrix<int, 1, -1>Eigen::RowVectorXi1×Nの列ベクトル

3.2. float型Vectorの定義

テンプレートtypedef内容
Eigen::Matrix<float, 2, 1>Eigen::Vector2f2×1の列ベクトル
Eigen::Matrix<float, 3, 1>Eigen::Vector3f3×1の列ベクトル
Eigen::Matrix<float, 4, 1>Eigen::Vector4f4×1の列ベクトル
Eigen::Matrix<float, 1, 2>Eigen::RowVector2f1×2の列ベクトル
Eigen::Matrix<float, 1, 3>Eigen::RowVector3f1×3の列ベクトル
Eigen::Matrix<float, 1, 4>Eigen::RowVector4f1×4の列ベクトル
Eigen::Matrix<float, -1, 1>Eigen::Vector2fN×1の列ベクトル
Eigen::Matrix<float, 1, -1>Eigen::RowVectorXf1×Nの列ベクトル

3.3. double型Vectorの定義

テンプレートtypedef内容
Eigen::Matrix<double, 2, 1>Eigen::Vector2d2×1の列ベクトル
Eigen::Matrix<double, 3, 1>Eigen::Vector3d3×1の列ベクトル
Eigen::Matrix<double, 4, 1>Eigen::Vector4d4×1の列ベクトル
Eigen::Matrix<double, 1, 2>Eigen::RowVector2d1×2の列ベクトル
Eigen::Matrix<double, 1, 3>Eigen::RowVector3d1×3の列ベクトル
Eigen::Matrix<double, 1, 4>Eigen::RowVector4d1×4の列ベクトル
Eigen::Matrix<double, -1, 1>Eigen::Vector2dN×1の列ベクトル
Eigen::Matrix<double, 1, -1>Eigen::RowVectorXd1×Nの列ベクトル

3.4. Eigen::scomplex(std::complex)型Vectorの定義

テンプレートtypedef内容
Eigen::Matrix<Eigen::scomplex, 2, 1>Eigen::Vector2cf2×1の列ベクトル
Eigen::Matrix<Eigen::scomplex, 3, 1>Eigen::Vector3cf3×1の列ベクトル
Eigen::Matrix<Eigen::scomplex, 4, 1>Eigen::Vector4cf4×1の列ベクトル
Eigen::Matrix<Eigen::scomplex, 1, 2>Eigen::RowVector2cf1×2の列ベクトル
Eigen::Matrix<Eigen::scomplex, 1, 3>Eigen::RowVector3cf1×3の列ベクトル
Eigen::Matrix<Eigen::scomplex, 1, 4>Eigen::RowVector4cf1×4の列ベクトル
Eigen::Matrix<Eigen::scomplex, -1, 1>Eigen::Vector2cfN×1の列ベクトル
Eigen::Matrix<Eigen::scomplex, 1, -1>Eigen::RowVectorXcf1×Nの列ベクトル

3.5. Eigen::dcomplex(std::complex)型Vector定義

テンプレートtypedef内容
Eigen::Matrix<Eigen::dcomplex, 2, 1>Eigen::Vector2cd2×1の列ベクトル
Eigen::Matrix<Eigen::dcomplex, 3, 1>Eigen::Vector3cd3×1の列ベクトル
Eigen::Matrix<Eigen::dcomplex, 4, 1>Eigen::Vector4cd4×1の列ベクトル
Eigen::Matrix<Eigen::dcomplex, 1, 2>Eigen::RowVector2cd1×2の列ベクトル
Eigen::Matrix<Eigen::dcomplex, 1, 3>Eigen::RowVector3cd1×3の列ベクトル
Eigen::Matrix<Eigen::dcomplex, 1, 4>Eigen::RowVector4cd1×4の列ベクトル
Eigen::Matrix<Eigen::dcomplex, -1, 1>Eigen::Vector2cdN×1の列ベクトル
Eigen::Matrix<Eigen::dcomplex, 1, -1>Eigen::RowVectorXcd1×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

コメント

タイトルとURLをコピーしました