MATLAB함수 C에서 불러 사용하기(Engine) + C코드로 짠 함수 Matlab에서 사용하기!(MEX)

2012. 10. 27. 18:38Programming/C & C++

MATLAB처럼 몇가지 함수를 불러서 C언어에서 MATLAB처럼 이용할 수 있다면 얼마나 좋겠습니까. C언에서 제공되는 라이브러리가 이렇다면 MATLAB이 설 자리가 없어지겠죠. C언어에서 제공되는 math에는 기본적인 수학과 관련된 것들이고 MATLAB처럼 이용할려면 전체를 스스로 알고리즘을 구현하여서 라이브러리를 만들어 사용하셔야 겠죠. 

이러한 라이브러리를 지금 개발하시는 일은 아닐테고 MATLAB의 기능을 그대로 이용하고 싶다면 C-MEX로 사용하시는 방법밖에는 없습니다. MATLAB에서 이미 C언어에자신들의 라이브러리를 이용할 수 있게 한 방법입니다.

아래는 C언어의 라이브러리와 MATLAB의 API를 이용하여 코딩을 하고서 이를 MATLAB안에서 불러쓰는 방법입니다.


예를 들어서 설명을 해보죠 아래는 입력된 매트릭스의 제곱을 구현한 것입니다.

#include "mex.h"

void mexFunction(int ds, mxArray *d[], int ss, const mxArray *s[])
{
int m, n, size, i;
double *x, *y;

if (ds != 1 || ss != 1) mexErrMsgTxt("usage: y = test(x)");

m = mxGetM(s[0]);
n = mxGetN(s[0]);
x = mxGetPr(s[0]);

d[0] = mxCreateDoubleMatrix(m, n, mxREAL);
y = mxGetPr(d[0]);

size = m * n;
for (i = 0; i < size; i++)
y[i] = x[i] * x[i];
}


사용가능한 matlab api는 

mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag); 
m행 n열 실수 매트릭스만들기, ComplexFlag는 mxREAL 또는 mxCOMPLEX 

mxArray *mxCreateNumericArray(int ndim, int *dims, mxClassID class, mxComplexity complexFlag); 
dims[]에 넣은 수대로(ndim개) 다차원 배열 만듬. class는 {mxCHAR_CLASS, 
mxSPARSE_CLASS, mxDOUBLE_CLASS, mxSINGLE_CLASS, mxINT8_CLASS, mxUINT8_CLASS, mxINT16_CLASS, mxUINT16_CLASS, mxUINT32_CLASS, mxUINT32_CLASS} 등. 

int mxGetM(const mxArray *array_ptr); 
int mxGetN(const mxArray *array_ptr); 
행 개수(M), 열 개수(N) 구하기 

double *mxGetPr(const mxArray *array_ptr);
double *mxGetPi(const mxArray *array_ptr); 
매트릭스의 실수, 허수 부분 포인터(Pr:Pointer to real part, Pi:Pointer to imaginary part) 

void *mxMalloc(size_t n); 
c의 stdlib의 malloc에 해당함. MEX의 경우 mexFunction이 끝나면 matlab이 알아서 해제(free)한다. 


이렇게 mex.h를 include하고 mexFunction() 프로토타입을 지켜서 MATLAB API를 이용하여 c코드를 작성하시면 됩니다.

작성된 c코드를 컴파일 할 때 MATLAB라이브러리를 링크하여 두시고요.

이와 같이 해서 생성된 라이브러리는 MATLAB path에 있는 상태서 MATLAB에서 테스트를 하시면 됩니다. C언어로 코딩할 때 사용하실 수 있는 MATLAB의 API는 C-MEX를 보시면 됩니다.

그리고 MATLAB에서 만들어진 .m 파일을 c/c++로 변환하기 위해서는

test.m이라는 MATLAB파일을 만들었다고 가정하면

처음에 
>>mex -setup
이렇게 하여서 컴파일러를 선택합니다.

>>mbuild -setup
이렇게 하여 다시 컴파일러를 선택합니다. 이것은 stand alone으로 만들기 위한 것입니다.

>>mcc -p -B -sglcpp test.m
이렇게 하면 c/c++코드와 실행파일을 만들어줍니다.

test.exe file과 bin directory 그리고 MATLAB이 설치된 곳에 있는 mglinstaller.exe 이 세개를 사용하시면 됩니다.