Eigen 라이브러리 matrix 사용법

본 글은 eigen 라이브러리의 matrix 간단한 사용법에 관한 글을 싣고 있다.

Eigen 라이브러리는 http://eigen.tuxfamily.org/에서 다운받아 사용할 수 있다. 별도의 라이브러리 빌드 없이 헤더만 불러와 사용할 수 있어 편리하다. 개인적으론 opencv의 Mat보다 Eigen의 Matrix가 사용하기 편한 것 같다.

라이브러리 경로 project 설정 추가

다운받은 라이브러리 파일은 압축해제 후 project 설정에서 경로만 추가하면 된다.

라이브러리 헤더 

#include <Eigen/Dense>


namespace 

아래와 같이 Eigen namespace를 사용하도록 설정하던가, 아니면, 호출 때 마다 Eigen::을 사용하면 된다. 
using namespace Eigen;

matrix 데이터 형식 

Matrix 타입의 맨 뒤는 matrix내 데이터의 형식을 의미한다.
EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int,                  i)
EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float,                f)
EIGEN_MAKE_TYPEDEFS_ALL_SIZES(double,               d)
EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<float>,  cf)
EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<double>, cd)

matrix 타입

Eigen의 matrix 타입은 고정 사이즈와 가변 사이즈 두가지가 있다. 아래는 두 타입을 비교한 코드다. Dynamic-Size의 matrix타입은 사용시 matrix의 row수와 column수를 정해줘야 한다.

 Fixed-Size Dynamic-Size 
Eigen::Matrix3d m;
m << 1, 2, 3, 4, 5, 6, 7, 8, 9;
m = m + Eigen::Matrix3d::Constant(1);
Eigen::Vector3d v(1, 2, 3);
Eigen::MatrixXd m(3, 3);
m << 1, 2, 3, 4, 5, 6, 7, 8, 9;
m = m + Eigen::MatrixXd::Constant(3,3,1);
Eigen::VectorXd v(3);
v << 1, 2, 3;
 
 


Dynamic-size matrix 타입의 행과 열

열(row)의 개수를 3, 행(column)의 개수는 2으로 하고자 하면 아래와 같이 선언하면 된다. 
Eigen::MatrixXd m(3, 2);

m(0, 0) = 1.0;
m(0, 1) = 2.0;

m(1, 0) = 3.0;
m(1, 1) = 4.0;

m(2, 0) = 5.0;
m(2, 1) = 6.0;

std::cout << m << std::endl;
 



Matrix 데이터 입력/설정 방법

아래 코드와 같이 matrix 선언 후 m<<1,2… 혹은 m(0,0)=… 와 같은 방법으로 matirx에 데이터를 넣을 수 있다. 
Eigen::MatrixXi m(3, 2);
std::cout << "m.cols=" << m.cols() << std::endl;
std::cout << "m.rows=" << m.rows() << std::endl;

m << 1, 2, 3, 4, 5, 6;
std::cout << m << '\n' << std::endl;

m(0, 0) = 6;
m(0, 1) = 5;
m(1, 0) = 4;
m(1, 1) = 3;
m(2, 0) = 2;
m(2, 1) = 1;

std::cout << m << '\n' << std::endl;

for (int j = 0; j<m.cols(); ++j)  
for (int i = 0; i<m.rows(); ++i)
m(i, j) = (i*1) + (j+1);     

std::cout << m << '\n' << std::endl;

Eigen::VectorXf v(4); 
v[0] = 1; v[1] = 2; v(2) = 3; v(3) = 4;
std::cout << v << std::endl;

 

Matrix 연산

matrix간의 연산은 아래와 같은 방법으로 사용 가능한다. 
Eigen::Matrix2d m1 = Eigen::Matrix2d::Random();
Eigen::Matrix2d m2 = m1.inverse();

std::cout << "m1 = " << std::endl << m1 << std::endl;
std::cout << "\nm2 = m1.inverse() = " << std::endl << m2 << std::endl;

std::cout << "\nm1 + m2 = " << std::endl << m1+m2 << std::endl;
std::cout << "\nm1 - m2 = " << std::endl << m1-m2 << std::endl;
std::cout << "\nm1 * m2 = " << std::endl << m1*m2 << std::endl;

std::cout << "\nm1 + 1.5 = " << std::endl << m1+Eigen::Matrix2d::Constant(1.5) << std::endl;
std::cout << "\nm1 * 1.5 = " << std::endl << m1*Eigen::Matrix2d::Constant(1.5) << std::endl;

 

더 많은 사용 예제는 다운받은 eigen 압축파일의 \doc\examples안에 있다.  

댓글

이 블로그의 인기 게시물

아두이노(arduino) 심박센서 (heart rate sensor) 심박수 측정 example code

쉽게 설명한 파티클 필터(particle filter) 동작 원리와 예제

간단한 cfar 알고리즘에 대해

windows에서 간단하게 크롬캐스트(Chromecast)를 통해 윈도우 화면 미러링 방법

리눅스 디바이스 드라이버 기초와 예제