void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
其中,参数nlhs和nrhs表示MATLAB在调用该MEX文件时等式左端和右端变量的个数,例如在MATLAB命令窗口中输入以下命令:
[a,b,c]=Matlab_1(d,e,f,g) 则nlhs为3,nrhs为4。
MATLAB在调用MEX文件时,输入和输出参数保存在两个mxArray*类型的指针数组中,分别为prhs[]和plhs[]。prhs[0]表示第一个输入参数,prhs[1]表示第二个输入参数,…,以此类推。如上例中,d→prhs[0],e→prhs[1],f→prhs[2],f→prhs[3]。同时注意,这些参数的类型都是mxArray *。
接口过程要把参数传递给计算过程,还需要从prhs中读出矩阵的信息,这就要用到下面的mx-函数和mex-函数。 1.5 常用的mex-函数和mx-函数
在MATLAB6.5版本中,提供的mx-函数有106个,mex-函数有38个,下面我们仅介绍常用的函数。
1.入口函数mexFunction
该函数是C MEX文件的入口函数,它的格式是固定的:
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
说明:
MATLAB函数的调用方式一般为:[a,b,c,…]=被调用函数名称(d,e,f,…),nlhs保存了等号左端输出参数的个数,指针数组plhs具体保存了等号左端各参
数的地址,注意在plhs各元素针向的mxArray内存未分配,需在接口过程中分配内存;prhs保存了等号右端输入参数的个数,指针数组prhs具体保存了等号右端各参数的地址,注意MATLAB在调用该MEX文件时,各输入参数已存在,所以在接口过程中不需要再为这些参数分配内存。
2.出错信息发布函数mexErrMsgTxt,mexWarnMsgTxt 两函数的具体格式如下: #include \
void mexErrMsgTxt(const char *error_msg); void mexWarnMsgTxt(const char *warning_msg);
其中error_msg包含了要显示错误信息,warning_msg包含要显示的警告信息。两函数的区别在于mexErrMsgTxt显示出错信息后即返回到MATLAB,而mexWarnMsgTxt显示警告信息后继续执行。
3.mexCallMATLAB和mexEvalString 两函数具体格式如下: #include \
int mexCallMATLAB(int nlhs, mxArray *plhs[],
int nrhs, mxArray *prhs[], const char *command_name); int mexEvalString(const char *command);
mexCallMATLAB前四个参数的含义与mexFunction的参数相同,
command_name可以MATLAB内建函数名、用户自定义函数、M文件或MEX文件名构成的字符串,也可以MATLAB合法的运算符。
mexEvalString用来操作MATLAB空间已存在的变量,它不返回任何参数。 mexCallMATLAB与mexEvalString差异较大,请看下面的例子。 【例2】试用MEX文件求5阶完全图邻接矩阵 的特征值及对应的特征向量。
5阶完全图的邻接矩阵为: 下面是求该矩阵的MEX文件。 [Matlab_2.cpp] #include \
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) {
double x; mxArray *y,*z,*w; int n; if (nrhs!=1)
mexErrMsgTxt(\ if (nlhs != 3)
mexErrMsgTxt(\ if
(!mxIsDouble(prhs[0])||mxGetN(prhs[0])*mxGetM(prhs[0])!=1)
mexErrMsgTxt(\ x=mxGetScalar(prhs[0]);
plhs[0]=mxCreateDoubleMatrix(x,x,mxREAL); plhs[1]=mxCreateDoubleMatrix(x,x,mxREAL); plhs[2]=mxCreateDoubleMatrix(x,x,mxREAL); n=mxGetM(plhs[0]); y=plhs[0]; z=plhs[1]; w=plhs[2];
//利用mexCallMATLAB计算特征值
mexCallMATLAB(1,&plhs[1],1,prhs,\ mexCallMATLAB(1,&plhs[2],1,prhs,\ mexCallMATLAB(1,&plhs[0],2,&plhs[1],\ mexCallMATLAB(2,&plhs[1],1,&plhs[0],\ //演示mexEvalString的功能 mexEvalString(\ mexEvalString(\}
在MATLAB命令窗口输入以下命令:
>> mex Matlab_2.cpp >> clear >> a=magic(5) a =
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 >> [y,z,w]=Matlab_2(5)
??? Undefined function or variable 'y'. a =
34 48 2 16 30 46 10 14 28 32 8 12 26 40 44 20 24 38 42 6 22 36 50 4 18 y =
0 1 1 1 1