본문 바로가기
Programming/Eigen

Eigen3 Matrices - 행렬변수 선언

by 항공학도 2020. 7. 1.

참고자료: https://dritchie.github.io/csci2240/assignments/eigen_tutorial.pdf    
                https://eigen.tuxfamily.org/dox/index.html 

Computer vision및 Deep-learning관련 open-source들을 살펴보다보면, Eigen으로 작성된 코드들이 많이 보인다. 하지만 Eigen library가 정확히 어떤 기능을하고 어떻게 쓸 수 있는지 알지 못하기 때문에 코드를 이해하는데 어려움이 있었다. 이 글에서는 이 Eigen Library에 대해 공부한 내용에 대하여 작성한다. 

이전글(Eigen3)에서 작성했던 기본 코드에 추가하여 Eigen라이브러리를 사용한 행렬 변수 선언에 대해 알아보도록 하겠다. 

Eigen은 OpenGL과 매우 유사한 data type 네이밍 규칙을 사용한다고한다. 아직 OpenGL에 대해서는 잘 모르기 때문에 이는 다음에 공부할 내용으로 남겨 둔다. 가장 큰 규칙으로는 [data type의 형태] + [data type 크기] + [data type 자료형] 의 방식으로 명명된다. Eigen matrices 형태를 예로 들면,

Matrix3f	A;
Matrix4d	B;

위의 예에서 변수 A는 Matrix3f, 즉 3x3 행렬에 자료형은 float 이고 변수 B는 4x4 행렬에 자료형은 double 이다. 이밖에 정사각 행렬이 아니거나 short형태의 행렬을 생성하기 위해서는 조금 다르지만 어렵지는 않은 다음의 방법으로 생성할 수 있다.

Matrix<short, 5, 5> M1;
Matrix<float, 20, 75> M2;

쉽게 이해 하겠지만, 변수 M1은 short 자료형을 가진 5x5행렬이고, 변수 M2는 float자료형을 가진 20x75 행렬이다. 이밖에도 Eigen은 데이터 크기가 정해지지 않은 변수도 'X'라는 접미사를 사용하여 허용한다. 

MatrixXf C; //크기가 정해지지 않은 float 자료형의 행렬 C선언
MatrixXd D; //크기가 정해지지 않은 double 자료형의 행렬 D선언

이를 확인하기 위해 다음과 같이 간단한 코드를 작성한다.

#include <iostream>
#include <Eigen/Core>
#include <ros/ros.h>

using namespace std;

int main(int argc, char **argv) 
{
    ros::init(argc, argv, "eigen_test");
    ros::NodeHandle nh;
    ros::Rate rate(40.0);

    Eigen::Matrix3f A;
    Eigen::Matrix4f B;

    //Comma Initializer syntax: Identity Matrix A
    A <<    1.0f, 0.0f, 0.0f,
            0.0f, 1.0f, 0.0f,
            0.0f, 0.0f, 1.0f;

    //Paranthesis Operator: Zero initialized matrix B
    for (int i=0; i<4; i++){
        for (int j=0; j<4; j++){
            B(j,i) = 0.0;
        } 
    }

    cout << "matrix A: \n" << A << endl;
    cout << "matrix B: \n" << B << endl;
        
    return 0;
};

A Matrix는 Comma Initialize를 사용하였는데 이때는 'row by row' 순서로 ((0,0)->(0,1)->(0,2)->(1,0)...) 값을 초기화 한다. 이방법을 사용할 때 주의할 점은 행렬의 숫자와 동일한 모든 변수를 초기화 해줘야 한다는 것이다. 위의 예에서는 3x3행렬 이기 때문에 9개의 변수를 모두 초기화 해줘야 하며 그렇지 않을 경우 오류가 발생한다. B Matrix는 괄호연산자 (Paranthesis Operator)를 사용하여 각각의 index에 값을 초기화 해주었다. C/C++ 또는 python은 array에 square bracket [ ]을 사용하는 것에 반해 Eigen에서는 괄호 ( )를 사용한다는것에 유의 해야 한다. 테스트 결과는 다음과 같다.

이외에도 Eigen은 다양한 초기화 방식을 제공한다.

//[-1, 1]사이의 uniform random 값 지정
A = Matrix3f::Random();

//Identity Matrix
B = Matrix4d::Identity();

//zero matrix
C = Matrix3f::Zero();

//모든 elements를 1로
D = Matrix3f::Ones();

//모든 elements에 특정 상수값 지정
E = Matrix4d::Constant(4.5);

'Programming > Eigen' 카테고리의 다른 글

Eigen3 Vector  (0) 2020.07.01
Eigen3 Matrix Operations - 행렬연산  (0) 2020.07.01
Eigen3 란?  (0) 2020.06.09

댓글