DSP 실험 2번째 주에는 행렬연산에 대하여 배웠습니다. 수업시간에는 그냥 포인터에 배열을 할당하여, 행렬을 만들고, transpose한 행렬을 하나 더 만들어 두 행렬을 곱하는 연산을 해보았는데요. 사실 처음에 프로그래밍 언어에 익숙해지고, 내용에 익숙해지기 위해서는 직접 만들어서 실행해 보는 것이 좋지만, 익숙해지고 나서도 직접 만들어 쓰는 것은 피곤한 일이기도 하고, (물론 완벽하게 코드를 쓰시는 분에게는 다른 이야기겠지만)프로그램의 에러 확률이 높아지는 원인이 되기도 하죠. (옛날에 자료구조를 배우고 난 직후 스택이랑 큐, 벡터 등 자료구조들을 일일히 직접 만들어 쓰던때가 생각나네요 ㅋㅋ)

서론이 길었네요 ㅎㅎ. 어쨋든 이 포스팅에는 이러한 매트릭스 연산 뿐만 아니라 선형연산에 대하여 많은 함수 및 클래스를 지원하는 라이브러리인 Eigen library에 대하여 소개를 하고자 합니다.

먼저 Eigen library를 쓰려면 Eigen library를 다운받아야 겠죠? 구글에 Eigen이라고 검색을 하거나 아래의 링크를 클릭하여 Eigen library를 받아줍니다.

Eigen Main Page

링크를 클릭하면 아래와 같은 화면이 나타날 겁니다.

캬 Eigen is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms.

말 그래도 입니다. 그냥 선형대수학에 관한 것들은 거의 다 있죵 ㅎㅎ. 흠.. latest stable release가 현재로써는 3.2.5버젼이네요 ㅋㅋ Get it에서 library를 다운로드 해줍니다. 압축포맷이 여러가지가 있는데, 다 똑같은 겁니다. 따로 압축 프로그램이 안깔려 있다면 그냥 zip파일을 다운로드 받아서 원하는 곳에 압축을 풀어줍시다!(용량이 얼마 안돼서 금방 다운로드 될겁니다!)

압축푼 폴더를 보면

캬 이것저것 많이 있네요 ㅎㅎ cmake 어쩌고 저쩌고 써져있는 것들은 cmake로 라이브러리를 따로 만들때 사용되는 것들이랍니다. 뭐 지금 단계에선 알필요 없어요. 아, 그리고 eigen library는 따로 설치 같은게 필요없습니다. 그냥 간단하게 파일 경로만 인클루드 시켜주면 되요!

어쨋든... 다운로드 받아서 압축을 풀어주셨다면 이제 Eigen library를 사용할 준비가 다 된 것입니다. ㅋㅋ 이제 Eigen을 이용한 프로그램을 만들기 위해 Visual studio를 실행하도록 하죠!

즐거운 마음으로 콘솔 어플리케이션 프로젝트를 만들어 줍니다.

프로젝트를 클릭한 후 alt+enter 또는 우클릭 properties 또는 메뉴바 Project-properties클릭을 하여 속성창을 열어줍니다!

VC++ Directories에서 Include Directories 편집창을 열어줍니다. 직접 path쓰셔도 됩니다.


저같은 경우는 Downloads에 압축을 풀었습니다. eigen library 압축푼 폴더로 경로를 설정해줍니다. Select Forder누르고 ok ok!

그럼 이제 cpp파일에 Eigen library를 이용한 간단한 프로그램을 만들어 봅시다.


#include <iostream>
#include <Eigen/Dense>
#define PI 3.14159265359
using namespace Eigen;
using namespace std;

int main()
{
	MatrixXd m1 = MatrixXd(8, 8);
	MatrixXd m2, m3;

	//8*8행렬 m1에 값을 넣어줍니다.
	double* alpha = new double[8];
	for (int i = 0; i < 8; i++) {
		if (i == 0)
			alpha[i] = 1. / (2.*sqrt(2));
		else {
			alpha[i] = 0.5;
		}
	}

	for (int i = 0; i < 8; i++) {
		for (int j = 0; j < 8; j++) {
			m1(i,j) = alpha[i] * cos((PI*(2.*j + 1)*i) / 16);
		}
	}
	delete alpha;

	m2 = m1.transpose();//m2에 m1을 transpose한 값을 넣어줍니다.
	m3 = m1*m2;//m3에 m1과 m2를 곱한 값을 넣어줍니다.
	cout <<"m1"<<endl<< m1 << endl <<"m2"<<endl<< m2 << endl <<"m3"<<endl<< m3 << endl;//출력!
	return 0;
}

코드를 실행해보면!

m1과 m2와 m3가 출력된 것을 볼 수 있습니다. m3는 identity matrix이군요!(아주 작은 값들은 0이라고 봅시다 ㅎㅎ 1,2,3의 10의 -13승이니 0이라고 봐도 무방하죠.) 그렇다면 m1행렬을 A라 했을때, 

행렬 A는 orthogonal matrix(직교행렬)라고 볼 수 있겠군요!

Eigen library에 대한 자세한 documentation은 Eigen 페이지에 가면 있습니다.

오늘 포스팅은 여기까지 하겠습니다 ㅎㅎ

+ Recent posts