Eigen 라이브러리 matrix 사용법
본 글은 eigen 라이브러리의 matrix 간단한 사용법에 관한 글을 싣고 있다.
Eigen 라이브러리는 http://eigen.tuxfamily.org/에서 다운받아 사용할 수 있다. 별도의 라이브러리 빌드 없이 헤더만 불러와 사용할 수 있어 편리하다. 개인적으론 opencv의 Mat보다 Eigen의 Matrix가 사용하기 편한 것 같다.
라이브러리 경로 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안에 있다.
댓글
댓글 쓰기