2012. 10. 27. 18:38ㆍProgramming/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 이 세개를 사용하시면 됩니다.
'Programming > C & C++' 카테고리의 다른 글
Visual Studio 2017에서 OpenCV 4.2.0을 사용하는 방법 (0) | 2020.02.06 |
---|---|
[C++ TroubleShooting] Control reaches end of non-void function| (0) | 2013.01.24 |
[C++ TroubleShooting] multiple types in one declaration (0) | 2013.01.24 |