Ref:
http://blog.sina.com.cn/s/blog_7e71290d0101fkk7.html
http://blog.sina.com.cn/s/blog_54dd80920102v28x.html
====
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
statements;
}
-------
调用mex时,MATLAB将输入的数据通过入口子程序赋给输入参数指针,同时创建由输出参数指针指向的输出矩阵,然后将这些指针作为计算子程序的参数传递到计算子程序进行计算。
mexFunction在调用C函数时,直接使用指针传递参数是比较方便的,一方面需要计算的结果往往是一个矩阵而不是一个数,另一方面以值传递值返回的方式,同样需要赋值给mex接口的指针。
在mexFunction的参数中:
nlhs表示输出参数的个数
nrhs表示输入参数的个数
类型为mxArray的指针数组,用于指向输出的每个参数
类型为mxArray的指针数组,用于指向输入的每个参数
为了mex的正确执行,也是良好编程习惯的要求,需要对输入参数和输出参数进行个数和类型的检查:
mxGetClassID //获得指针所指变量类型
mxIsNumeric, mxIsCell等,检查指针所指变量是否为符合某种要求的变量类型。更多可查阅帮助。
参数检查过程中可使用mexErrMsgTxt输出错误信息。
mxGetM, mxGetN,获得矩阵的行数和列数
mxGetDimensions,获得矩阵维数
mxGetPr,mxGetPi,获得矩阵实数部分、虚数部分的指针
mxGetString, 获得字符串内容
mxGetElementSize, 获得存储矩阵元素所需要的字节数
mxCalloc,内存分配。用mxCalloc不用calloc和malloc,因为mxCalloc会自动释放内存,不需要手动free了。
mxCreateString, 创建1*N的字符串矩阵
mxCreateDoubleMatrix, 创建2维双精度浮点矩阵,可以是实数(mxREAL)或者复数(mxCOMPLEX)
mxCreateStructArray, 创建N维结构体矩阵
mxCreateCellMatrix, 创建二维单元矩阵
mxCreateNumericArray,创建n维数值矩阵
mexPrintf, 重新封装的printf
mxSetFiled, 设置结构体矩阵的域
mxSetCell, 设置单元矩阵的单元值
mxSetPr, 设置矩阵实数值
mxSetPi, 设置矩阵虚数值
mxCallMATLAB, 调用MATLAB中其他内建函数、自定义M文件、mex文件。
具体使用方法可查阅MATLAB帮助。
使用mex时的注意事项:
1.MATLAB调用mex接口时,将参数个数及参数指针传入接口子程序,由接口子程序完成指针和调用变量的赋值、输出数据的内存空间分配,接口子程序再将参数指针或经过赋值的变量作为参数传递给C的计算子程序,完成调用过程。调用时应注意指针所指对象的正确性,为处理正确最好做相应的强制类型转换。
2.mex并不便于调试,因此应在C的IDE中用测试集调试后再放入mex文件中。
3.MATLAB中指向二维及高维数组的指针递增方式是按行递增的,而C中是按列递增的,因此计算index时要注意位置。
e.g:
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
{
double *a;
double b, c;
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
a = mxGetPr(plhs[0]);
b = *(mxGetPr(prhs[0]));
c = *(mxGetPr(prhs[1]));
*a = add(b, c);
}