[Eigen] C++ template library for linear algebra

Eigen 라이브러리는 웹사이트에 게시된 그대로 선형대수 라이브러리 이다.

http://eigen.tuxfamily.org/index.php?title=Main_Page

eigenvector 연산 때문에 이 라이브러리를 교수님께서 소개해 주셨다.

고유벡터에 대한 이야기는 다음 포스팅에서 하고,

Matlab[eval,evec]=eig(M)과 같은 결과의 고유벡터를 뽑고싶으면 이 라이브러리를 사용하면 된다.

opencv의 eigen이나 타 라이브러리는 결과값이 Matlab과 일치하지 않는다.

여러 컴파일러를 지원하고, 여러가지 언어를 지원한다.

처음에 설치할때 쓸데없이 애를좀 먹었는데,

http://eigen.tuxfamily.org/index.php?title=Visual_Studio

여기 써있는대로 CMake는 테스트를 위한것이지 라이브러리 임포트가 아니다.

먼저 해당 라이브러리를 다운받으면, eigen-eigen-b9cd8366d4e8과 같은 폴더가 있는데,

이 안에 Eigen폴더만 따로 컴파일러에서 추가포함라이브러리에 걸어놓으면 된다.

C++의 기본 라이브러리와 같이 .h, .hpp가 아닌 확장자가 없는 형태이다. 아래는 opencv의 행렬을 Eigen행렬로 변환하고, 고유벡터를 구한후 다시 opencv 벡터로 가져오는 모습이다.

#include<Eigen/Core>
#include<Eigen/Eigenvalues>

Eigen::MatrixXd mtx_evec = Eigen::MatrixXd::Ones(3, 3);  
for (int i = 0; i < 3; i++){  
    for (int j = 0; j < 3; j++){
        mtx_evec(i, j) = M2.at<cvFloat>(i, j);
    }
}
Eigen::EigenSolver<Eigen::MatrixXd> es(mtx_evec);  
auto evec_t = es.eigenvectors();  
cv::Mat evec(3, 3, CV_64FC1);  
for (int i = 0; i < 3; i++){  
    for (int j = 0; j < 3; j++){
        evec.at<cvFloat>(i, j) = evec_t(i, j).real();
    }
}

주로 행렬쪽만 사용해 봤는데, 매우 괜찮다. 단점이라면 컴파일이 좀 느린것...

연구실 컴퓨터 cpu가 i5 ㅠㅠ

주의 사항이라면, 전치행렬을 사용할때 transpose() 메소드가 아닌 adjoint() 메소드를 써야 한다.