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++程式。