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안에 있다.  

댓글

이 블로그의 인기 게시물

간단한 cfar 알고리즘에 대해

바로 프로젝트 적용 가능한 FIR Filter (low/high/band pass filter )를 c나 python으로 만들기

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

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

base64 인코딩 디코딩 예제 c 소스