天天看點

MATLAB 編譯并調用 C、C++程式

MATLAB 編譯并調用 C、C++程式

MATLAB 的 C、C++程式編譯器的設定:

在指令視窗中輸入: >>mex -setup ,接着按照提示進行即可完成 C、

C++程式編譯器的設定。

在 MATLAB 中編譯 C、C++程式:

C、C++程式的格式以 test.cpp 為例,如下示:

#include "mex.h" //必須

#include <math.h>

//程式功能實作函數

void Desc2Pol ( double dbX, double dbY, double *pdbA, double *pdbG )

{

*pdbA = sqrt(dbX * dbX + dbY * dbY );

if (dbY == 0 )

{

if ( dbX < 0 )

{

*pdbG = -90;

}

else

{

*pdbG = 90;

}

}

else

{

*pdbG = atan( dbX/dbY );

}

}

//Matlab的接口函數,必須而且格式也一樣

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray, *prhs[] )

{

int mrows = 0;

int ncols = 0;

double dbX = 0;

double dbY = 0;

double *pdbA = NULL;

double *pdbG = NULL;

//必須是2個輸入參數

//包括

if ( nrhs != 2 )

{

mexErrMsgTxt("Two input required.");

}

//必須是2個輸出參數

//包括

if ( nlhs != 2 )

{

mexErrMsgTxt("Two output required.");

}

mrows = mxGetM(prhs[0]);

ncols = mxGetN(prhs[0]);

if ( mxIsComplex(prhs[0]) || !(mrows == 1 && ncols == 1))

{

mexErrMsgTxt("The First input must be a noncomplex scalar double precision.");

}

mrows = mxGetM( prhs[ 1 ] );

ncols = mxGetN( prhs[ 1 ] );

if ( mxIsComplex( prhs[ 1 ] ) || !(mrows == 1 && ncols == 1 ) )

{

mexErrMsgTxt("The fourth input must be a noncomplex scalar double precision.");

}

dbX = mxGetScalar( prhs[ 0 ] );

dbY = mxGetScalar( prhs[ 1 ] );

plhs[0] = mxCreateDoubleMatrix( mrows, ncols, mxREAL );

plhs[1] = mxCreateDoubleMatrix( mrows, ncols, mxREAL );

pdbA = mxGetPr( plhs[0] );

pdbG = mxGetPr( plhs[1] );

Desc2Pol( dbX, dbY, pdbA, pdbG );

}

将 MATLAB 的工作目錄切換至 test.cpp 所在目錄,在 MATLAB 的指令

視窗中,輸入: >>mex test.cpp ,若程式有錯,會有提示,若無錯,

會在 test.cpp 的旁邊生成 test.mexw32 檔案,這個檔案可以供 MATLAB

調用實作 test.cpp 中的 C、C++函數的功能。

在 MATLAB 中調用 C、C++程式:

将 MATLAB 的工作目錄切換至上面已編譯好的 test.mexw32 所在的目

錄,在 MATLAB 的指令視窗中輸入: >>[a b] = test(1,1); 即可實

現調用 C、C++程式。