最近在使用matlab的mex功能与C++进行混合编程,目的是在matlab里调用C++,起到加速的作用。而我之前写好的C代码是基于opencv库的,因此还需要调用opencv的库,因此在使用mex编译C代码的时候还需要链接到opencv库,下面我具体描述使用过程。
第一步、设置matlab 的mex编译器
打开matlab,在command window里输入mex –setup,按照提示选择对应的C++编译器。
我电脑上安装的是vs2013,因此配置其为编译器。(对应vc12)
第二步、修改C代码为mex接口
一般包括:
1)添加头文件mex.h
#include"mex.h"
2)添加接口函数mexFunction()
mexFunction的定义为:
void mexFunction(int nlhs, mxArray*plhs[],int nrhs, const mxArray *prhs[]){
}
这个接口函数的作用就是实现matlab与C++之间的数据转换,其中几个变量:
nlhs: number of left hand size parameters,也就是Matlab调用语句左边的变量个数,实际上就是需要返回给Matlab的返回值变量有多少个。
plhs: pointer of left hand size parameters,也就是函数返回参数的指针。但它是一个指针数组。换句话说,它是一个数组,每个元素是个指针,每个指针指向一个数据类型为mxArray的返回参数。
nrhs: number of right hand size parameters,也就是Matlab调用语句右边的变量个数。
prhs: pointer of right hand size parameters,和plhs类似,是matlab右变量的指针数组,注意prhs是const的指针数组,即不能改变其指向内容。
总结一下,就是nrhs和prhs代表的是输入参数的个数与变量指针,nlhs和plhs代表的是输出参数的个数与指针。
有了传递方法,如何得到函数内指针对应的值呢?这就需要利用mex.h里一系列专用的函数了,可以参考《精通Matlab与C C++混合程序设计第2版》第三章的内容或者是math work上的官方文档。这里说明几个常用的函数:
mxGetN Number of columns in array 得到矩阵列数
mxSetN Set number of columns in array 得到矩阵行数
mxGetScala