MATLAB在数值运算、图像处理、实时仿真方面具有很大得优势,但它得运行速度远远不及C语言或C++,为了解决这一问题,MATLAB提供了和C/C++混合编程的接口,以此讲MATLAB对运算、图形处理得优点和c语言运行速度快得特点想结合。
混合编程的一般步骤:MATLAB 函数使用MATLAB格式数据 —>C/C++程序首先解析MATLAB数据 —>解析后运行C/C++程序,得到结果 —>C/C++程序最后要把上述结果数据打包成MATLAB格式输出给MATLAB中的主调程序。MATLAB是不能直接调用c语言的函数的,需要将c语言代码编译乘mex文件才可以调用,其中会用到一些辅助函数,本文以一个加法的例子介绍一下MATLAB与C混合编程的方法。
第一步 创建一个C文件
文件命名为add.c。
第二步 添加头文件“mex.h”
这一项是必须的,mex.h中包含了编译中用到的接口变量,函数等。
第三步 定义c语言的功能函数
void add(double *x,double *y,double *z)
{
*z=*x+*y;
}
这里我们全部用指针的方式传递输入输出参数,实现z=x+y的功能。
第四步 定义MexFunction函数
这也是最关键的一步,MexFunction是c语言和MATLAB的接口函数,完成文章开头所叙述的操作。
void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[])
{
double *x, *y; /*被加数和加数*/
double *z; /*和*/
///////判断输入输出参数的维度
if(nrhs!=2) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs","Two inputs required.");
}
if(nlhs!=1) {
mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs","One outputs required.");
}
////////////////
x=mxGetPr(prhs[0]);//获取第一个输入参数的指针
y=mxGetPr(prhs[1]); //获取第二个输入参数的指针
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); //创建输出矩阵
z = mxGetPr(plhs[0]);//获取第一个输出参数的指针
add(x,y,z);调用add函数
}
代码中有详细的注释,这里对四个输入参数简单的介绍:
nlhs说明调用语句左手面(lhs-left hand side)有几个变量,输出数据个数
nrhs说明调用语句右手面(rhs-right hand side)有几个变量,输入数据个数。
*plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。代表左手边数据,也就是输出数据。
*prhs同上,代表输入数据
第五步 编译
需要提前安装好MinGW-w64工具箱,一般安装MATLAB的时候默认是不安装的,安装方法很简单,主页-附加功能->搜索“MinGW-w64”。
搜索MinGW-w64
点进去之后在右侧回看到下载和下载并安装,直接下载安装就可以了。需要注意的是这个附加功能仅支持2017b以上的版本。
然后就可以在命令行编译,直接输入以下命令即可:
mex add.c
编译成功后会在当前文件夹生成一个mexw64文件(32位系统的话就是mexw32)。
第六步 MATLAB调用
直接在脚本文件或者命令行调用即可。
a=add(1,2);
要保证输入有两个参数,输出一个参数,这里不能省略输出参数,因为我们在MexFunction中编写了判断输入输出参数的代码,如果没有输出参数的话,就会报错:
到这里就结束了,希望这个简单的例子能够帮到大家。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删