パハットノート

※当サイトではGoogleアドセンス広告を利用しています

C++ Eigen 可変長の行列MatrixXd




可変長の行列MatrixXd

Eigen::Matrix<double, M, N> mat;

で宣言する場合はMとNは定数でなければならないので#defineで宣言するなどの必要があり、プログラム中で行列のサイズを柔軟に変更できません。

しかし、Eigen::MatrixXdで宣言した行列はプログラム中でその大きさを変更でき、かつ変数からその大きさを設定できます。




基本的な使用方法(宣言、アクセス、表示)

基本的な使い方はEigen::Matrixで宣言した場合と同じです。

#include <iostream>
#include <Eigen/Dense>

int main() {
	//可変長の行列の宣言
	int r = 2;
	int c = 3;
	Eigen::MatrixXd m(r, c);

	//アクセス
	for (int i = 0; i < m.rows(); i++) {
		for (int j = 0; j < m.cols(); j++) {
			m(i, j) = (i + 1) * (j + 1);
		}
	}
	//表示
	std::cout << m << std::endl;
}


実行結果

1 2 3
2 4 6




サイズの変更(resize)

前述したようにMatrixXdで宣言した行列はプログラム中でその大きさを変更することができます。変更する場合は、
m.resize(行数, 列数)
というようにします。どこかでresizeした場合は行列の要素はすべて0で初期化させると読んだ気がしたのですが自分の場合はそうはなりませんでした(限りなく0に近いですが…)。

#include <iostream>
#include <Eigen/Dense>

int main() {
	//可変長の行列の宣言
	int r = 2;
	int c = 3;
	Eigen::MatrixXd m(r, c);

	//アクセス
	for (int i = 0; i < m.rows(); i++) {
		for (int j = 0; j < m.cols(); j++) {
			m(i, j) = (i + 1) * (j + 1);
		}
	}

	//表示
	std::cout << "resize前\n" << m << "\n" << std::endl;

	//大きさの変更(0で初期化される?)
	c = 2;
	m.resize(r, c);

	//表示
	std::cout << "resize後\n" << m << std::endl;
}


実行結果

resize前
1 2 3
2 4 6

resize後
1.60219e-306 6.23055e-307
1.33512e-306 2.22526e-307




特殊な初期化方法

MatrixXdに対しても単位行列や零行列で初期化することが可能です。

#include <iostream>
#include <Eigen/Dense>

int main() {
	//宣言(3×3の単位行列)
	Eigen::MatrixXd m = Eigen::MatrixXd::Identity(3, 3);

	//表示
	std::cout << "3×3の単位行列\n" << m << "\n" << std::endl;

	//2×2の零行列に変更
	m = Eigen::MatrixXd::Zero(2, 2);

	//表示
	std::cout << "2×2の零行列\n" << m << "\n" << std::endl;
}


実行結果

3×3の単位行列
1 0 0
0 1 0
0 0 1

2×2の零行列
0 0
0 0