참고 사이트
http://www.mathworks.com/support/solutions/data/1-2QTWCE.html?solution=1-2QTWCE
http://www.nbs.ntu.edu.sg/userguide/MatLab/MatLab6/toolbox/mathlib/cmathug/cmathug.html
http://www.fsa.ucl.ac.be/help/helpdesk.html
- 우선 Matlab의 Matlab Component Runtime Library를 인스톨 합니다.
MATLAB의 \toolbox\compiler\deploy\win32 폴더의 MCRInstaller를 실행하여 설치합니다.
- Matlab에서 원하는 Function을 작성합니다.
예를 들어 Inverse.m 을 다음과 같이 작성합니다.
function y=inverse(x)
y=inv(x);
- 먼저 compiler를 setting합니다.
Matlab command창에서
mbuild -setup을 실행하면 시스템에 설치된 컴파일러를 찾아 선택하게 됩니다.
- Matlab에서 해당 function을 컴파일 합니다.
Matlab command 창에서
mcc -B csharedlib:inverselib inverse.m
을 실행하면 inverselib.h inverselib.c inverselib.lib…. 등등의 파일을 생성합니다.
- Visual studio에서 테스트 프로젝트를 하나 만듭니다.
이 프로젝트 폴더로 아까 matlab이 생성한 파일들을 모두 카피합니다.
그리고 이 프로젝트가 matlab library를 사용할 수 있게 환경을 setting해 줍니다.
Tools->Options->Directories 의
include 와 library 의 path에 각각
C:\MATLAB7\extern\include
C:\MATLAB7\extern\lib\win32\microsoft\msvc60
를 추가해 줍니다.
그리고 Project->Settings->Link의 Object/library modules:에
mclmcrrt.lib inverselib.lib를 지정해 줍니다.
- View의 Header입니다.
만든 라이브러리를 사용하기 위해 헤더 inverselib.h를 include 해 주고,
행렬의 입력, 출력을 확인하기 위해 mxArray 포인터 타입의 변수 2개를 선언합니다.
#include "inverselib.h"
class CMatlabLibView : public CView
{
…...
mxArray *pX;
mxArray *pY;
…..
};
- View class의 OnCreate 함수
라이브러리의 초기화를 해 줍니다.
if( !mclInitializeApplication(NULL,0) )
{
AfxMessageBox("Could not initialize the application.");
exit(1);
}
if (!inverselibInitialize())
{
AfxMessageBox("Could not initialize the library.");
exit(1);
}
- View class의 OnDraw함수
2X2 행렬 하나를 만들고 inverse를 구해 출력해 봅시다.
int rows=2;
int cols=2;
static double data[] = { 1, 2, 3, 4 };
double *start;
pX = mxCreateDoubleMatrix(rows,cols,mxREAL);
start = (double *)mxGetPr(pX);
memcpy(start, data, rows * cols * sizeof(double) );
pY=NULL; <---- 반드시 NULL로 지정해 주어야 합니다.
mlfInverse(1,&pY,pX); <---- matlab에서 생성한 library의 함수 입니다.
double *x,*y;
x=(double*)mxGetPr(pX);
y=(double*)mxGetPr(pY);
for (int i=0;i<rows;i++)
{
for (int j=0;j<cols;j++)
{
double xx,yy;
xx=*(x+cols*i+j);
yy=*(y+cols*i+j);
CString str;
str.Format("%1.3f",xx);
pDC->TextOut(50*j,20*i,str);
str.Format("%1.3f",yy);
pDC->TextOut(200+50*j,20*i,str);
}
}
- View class의 OnDestroy 함수
끝나면 정리는 항상 확실히
mxDestroyArray(pX);
mxDestroyArray(pY);
inverselibTerminate();
mclTerminateApplication();
댓글 없음:
댓글 쓰기