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混合编程所必须的。格式为:

  1. #include “mex.h”   
  2.   
  3. void mexFunction( int nlhs, mxArray *plhs[],  
  4.   
  5.                    int nrhs, const mxArray *prhs[] )  
  6. {  
  7.   
  8.               //C语言代码   
  9.   
  10. }  

其中入口子程序函数名必须为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,文件内容为: 

  1. #include "mex.h"   
  2.   
  3. double add(double x, double y)  
  4. {  
  5.     return x+y;  
  6. }  
  7. void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])  
  8. {  
  9.     double a,b,*c;  
  10.   
  11.     a=mxGetScalar(prhs[0]);  
  12.     b=mxGetScalar(prhs[1]);  
  13.   
  14.     plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);  
  15.           
  16.     c=mxGetPr(plhs[0]);  
  17.   
  18.     *c=add(a,b);  
  19. }  

首先对文件内容进行简单说明:

其中nlhs (number of left-handside) 是输出参数的个数,nrhs (number of right-hand side) 是输入参数的个数。例如对于c=add(a,b),有nlhs=1,hrhs=2。

相关推荐