パープルハット

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

C++ Eigen ベクトルと行列(宣言、初期化、サイズの取得、アクセスなど)



大前提

これらの機能を使う際は、以下のインクルードを忘れないようにしましょう。

#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;
}

実行結果

23




加算、減算、積、乗算

#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 45 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





行列とベクトルの積

行列A=\begin{pmatrix}1&2\\3&4\end{pmatrix}とベクトルx=\begin{pmatrix}2\\3\end{pmatrix}の積y=Axを求めるプログラムは次のようになります

#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