본문 바로가기
Programming/Eigen

Eigen3 Matrix Operations - 행렬연산

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은 파워풀한 선형대수 라이브러리 답게 행렬연산도 아주 간단하게 수행할 수 있다. 작성된 코드와 실행결과를 통해서 확인해 보도록 하겠다.

산술연산

Eigen으로 선언된 변수에 한해서는 일반 integer또는 float형태 자료형의 산술연산과 유사하게 수행할 수 있다.

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

    //[-1,1]사이의 Uniform random 값을 갖는 4x4 행렬 선언
    Eigen::Matrix4f M1 = Eigen::Matrix4f::Random();
    //모든 elements가 2.2값을 가지는 4x4행렬 선언
    Eigen::Matrix4f M2 = Eigen::Matrix4f::Constant(2.2);

    //일반적인 행렬연산과 동일하게 행렬의 크기가 같아야 하고, 자료형이 같아야 한다.
    cout << "Addition: \n" << M1 + M2 << endl;
    cout << "Substraction: \n" << M1 - M2 << endl;
    //행렬의 inner dimension의 크기가 같아야 하고, 자료형이 같아야 한다.
    cout << "Multiplication: \n" << M1 * M2 << endl;
    cout << "Complex op.: \n" << M2 - Eigen::Matrix4f::Ones()*2.2 << endl;

    return 0;
};

실행 결과

행렬 연산

당연히 Transpose 및 Inverse도 지원한다.

//Trasposition
M1.transpose()
//Inversion(역행렬 계산을 위해서는 #include <Eigen/Dense> 추가해 준다.
//역행렬 계산이 불가할 때는 Nans 생성.
M1.inverse()

역행렬 계산이 불가능한 3x3 행렬 M1을 M1.inverse()로 연산 했을 때 실행 결과.

 

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

Eigen3 Vector  (0) 2020.07.01
Eigen3 Matrices - 행렬변수 선언  (2) 2020.07.01
Eigen3 란?  (0) 2020.06.09

댓글