Matlab与C/C++联合编程之从Matlab调用C/C++代码
利用Matlab与VC++联合编程,既可在C语言程序中打开Matlab引擎,调用Matlab的ToolBox函数和作图函数,也可在Matlab中调用C代码生成的动态链接库文件,用以加快执行速度、缩短开发周期,取得更好的效果。MATLAB与C语言的接口采用称为MEX的动态链接方式进行。MEX文件是由C源程序经过编译生成的MATLAB动态链接子程序,它的作用十分类似于MATLAB的内建函数,可由MATLAB方便地调用。本文主要讲解从Matlab中调用C/C++代码的相关知识。
Matlab调用C/C++的方式主要有两种:利用MEX技术和调用C/C++动态连接库。
利用MEX技术,从MATLAB调用C/C++代码
1)使用者应该在系统中安装MATLAB支持的C/C++编译器。在Matlab与C/C++混合编程之前,必须先对Matlab的编译应用程序mex和编译器mbuild进行正确的设置:
对Matlab编译应用程序mex的设置:mex –setup.
对Matlab编译器mbuild的设置:mbuild –setup.
2)MEX文件的源文件实际上就是一个C语言源文件, MEX的源文件结构由两部分组成:入口子程序和功能子程序。
入口子程序起链接C子程序与MATLAB系统的作用,是实现MATLAB与C混合编程所必须的。格式为:
- #include “mex.h”
- void mexFunction( int nlhs, mxArray *plhs[],
- int nrhs, const mxArray *prhs[] )
- {
- //C语言代码
- }
其中入口子程序函数名必须为mexFunction。其中nlhs (number of left-hand side) 是输出参数的个数,nrhs(number of right-hand side) 是输入参数的个数。prhs[]与plhs[]是指针数组变量,其元素为指向右变量与左变量的指针。在用户程序中可利用上述指针在C与MATLAB中相互传递数据。MEX函数库里的mexFunction()函数,相当于C语言中的main()函数。MEX源文件没有main(),而是以一个mexFunction()代替。
功能子程序用于完成一些特定的计算功能或硬件处理功能,由上述的入口子程序调用。如果必要,该程序可与入口子程序合二为一。
3)MEX源文件的编译
设上述两部分形成的源文件存为MyMEXFun.c。则可在MATLAB环境下使用mex MyMEXFun.c命令进行编译
4)MEX文件的调用格式
[a,b,c...]=MyMEXFun(x,y,z...)
其中,x,y,z...表示函数的输入变量;a,b,c...表示函数的输出变量。
5)MEX文件的调试
下面由一个简单的例子来讲解下MEX文件的调试。
在Matlab当前目录下新建一文件MyMEXFun.c,文件内容为:
- #include "mex.h"
- double add(double x, double y)
- {
- return x+y;
- }
- void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])
- {
- double a,b,*c;
- a=mxGetScalar(prhs[0]);
- b=mxGetScalar(prhs[1]);
- plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);
- c=mxGetPr(plhs[0]);
- *c=add(a,b);
- }
首先对文件内容进行简单说明:
其中nlhs (number of left-handside) 是输出参数的个数,nrhs (number of right-hand side) 是输入参数的个数。例如对于c=add(a,b),有nlhs=1,hrhs=2。