목요일, 4월 03, 2008

Matlab에서 만든 function을 C library로 Visual Studio 6.0에서 이용하기 기초 테스트

참고 사이트

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


  1. 우선 Matlab의 Matlab Component Runtime Library를 인스톨 합니다.

    MATLAB의 \toolbox\compiler\deploy\win32 폴더의 MCRInstaller를 실행하여 설치합니다.


  2. Matlab에서 원하는 Function을 작성합니다.

    예를 들어 Inverse.m 을 다음과 같이 작성합니다.


    function y=inverse(x)

    y=inv(x);


  3. 먼저 compiler를 setting합니다.

    Matlab command창에서

    mbuild -setup을 실행하면 시스템에 설치된 컴파일러를 찾아 선택하게 됩니다.


  4. Matlab에서 해당 function을 컴파일 합니다.

    Matlab command 창에서

    mcc -B csharedlib:inverselib inverse.m

    을 실행하면 inverselib.h inverselib.c inverselib.lib…. 등등의 파일을 생성합니다.



  5. 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를 지정해 줍니다.


  6. View의 Header입니다.

    만든 라이브러리를 사용하기 위해 헤더 inverselib.h를 include 해 주고,

    행렬의 입력, 출력을 확인하기 위해 mxArray 포인터 타입의 변수 2개를 선언합니다.


    #include "inverselib.h"


    class CMatlabLibView : public CView

    {

    …...

    mxArray *pX;

    mxArray *pY;

    …..

    };


  7. 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);

    }


  8. 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);

    }

    }


  9. View class의 OnDestroy 함수

    끝나면 정리는 항상 확실히


    mxDestroyArray(pX);

    mxDestroyArray(pY);

    inverselibTerminate();

    mclTerminateApplication();



댓글 없음:

댓글 쓰기