×

Matlab与C/C++混合编程接口及应用方法解析

消耗积分:1 | 格式:rar | 大小:0.5 MB | 2017-10-21

分享资料个

 1 引言
  Matlab 是当前应用最为广泛的数学软件,具有强大的数值计算、数据分析处理、系统 分析、图形显示甚至符号运算等功能[1]。利用这一完整的数学平台,用户可以快速实现十分 复杂的功能,极大地提高工程分析计算的效率[2][3]。但与其他高级程序[3]相比,Matlab 程序 是一种解释执行程序,不用编译等预处理,程序运行速度较慢[4]。
  C/C++语言是目前最为流行的高级程序设计语言之一[5]。它可对操作系统和应用程序以 及硬件进行直接操作,用C/C++语言明显优于其它解释型高级语言,一些大型应用软件如 Matlab 就是用C 语言开发的。
  在工程实践中,用户经常遇到Matlab 与C/C++混合编程的问题。本文基于Matlab 6.5和VC6.0 开发环境,在Windows 平台下就它们之间的混合编程问题进行深入研究并举例说明。
  2 Matlab 调用C/C++
  Matlab 调用C/C++的方式主要有两种:利用MEX 技术和调用C/C++动态连接库。
  在Matlab 与C/C++混合编程之前,必须先对Matlab 的编译应用程序mex 和编译器mbuild进行正确的设置[1]:
  对Matlab 编译应用程序mex 的设置:Mex –setup.
  对Matlab 编译器mbuild 的设置:Mbuild –setup.
  2.1 调用C/C++的MEX 文件
  MEX 是Matlab Executable 的缩写,它是一种“可在Matlab 中调用的C(或Fortran)语 言衍生程序”[6]。MEX 文件的使用极为方便,其调用方式与Matlab 的内建函数完全相同,只 需在Matlab 命令提示符下键入MEX 文件名即可。
  一个C/C++的MEX源程序通常包括4个组成部分,其中前3个是必须包含的内容,第4个则根据所实现的功能灵活选用:(1)#include “mex.h”;(2)MEX文件的入口函数mexFunction, MEX文件导出名必须为mexFunction函数;(3)mxArray;(4)API函数
  通过简单的例子说明C/C++的MEX 源程序编写和调用过程:
  #include “mex.h”
  void timeSTwo(double y[], double x[])
  { y[0] = 2.0*x[0]; }
  void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] )
  { double *x,*y; int mrows,ncols;
  if(nrhs!=1) mexErrMsgTxt(“One input required.”);
  else if(nlhs》1) mexErrMsgTxt(“Too many output arguments”);
  mrows = mxGetM(prhs[0]);ncols = mxGetN(prhs[0]);
  if( !mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||!(mrows==1 && ncols==1))
  mexErrMsgTxt(“Input must be a noncomplex scalar double.”);
  plhs[0]=mxCreateDoubleMatrix(mrows,ncols, mxREAL);
  x=mxGetPr(prhs[0]); y=mxGetPr(plhs[0]); timestwo(y,x); }
  用指令mex timestwo.c 编译此文件,然后在MATLAB 命令行下调用生成的MEX 文件即可。
  2.2 调用C/C++动态连接库
  Matlab 提供对动态连接库DLL 文件的接口[7]。利用该接口,可在Matlab 中调用动态连 接库导出的函数。Matlab 对DLL 的接口支持各种语言编写的DLL 文件。在调用DLL 文件之 前,需要准备函数定义的头文件。对于C/C++语言开发的DLL 文件,可使用源程序中相应的 头文件;而对于其他语言开发的DLL,则要手工准备等效的C 语言函数定义头文件。
  在Matlab 中利用动态连接库接口技术通常需要完成以下4 个步骤:
  (1)打开动态连接库文件;(2)为调用函数准备数据;(3)调用动态连接库文件中导出的 函数;(4)关闭动态连接库文件。
  为了实现以上步骤,用到的Matlab 函数有:loadlibrary,loadlibrary,calllib,
  libfunctions,lipointer,libstruct,libisloaded。下面举例说明Matlab 调用C/C++动态 连接库的方法和步骤:
  a.在VC 环境下,新建工程-》win32 动态连接库-》工程名Test1-》empty 工程-》完成;
  b.新建-》C++源文件-》添加a.cpp,内容为: #include “a.h”
  _declspec(dllexport) int add(int a, int b) { return a+b; }
  c.新建-》C/C++头文件-》添加a.h,内容为: _declspec(dllexport) int add(int a,intb);然后编译生成Test1.dll 动态连接库文件,将Test1.dll 和a.h 拷到Matlab 工作目录下。
  d.在Matlab 命令行下,调用Test.dll:》》loadlibrary(‘Test1’,’a.h’); 》》x=7;
  》》y=8; 》》calllib(‘Test1’,‘add’,x,y); Ans=15 》》unloadlibrary(‘Test1’)。
  调用DLL 动态连接库的方法,为Matlab 重用工程实践中积累的大量实用C/C++代码提供了一种简洁方便的方法。与调用MEX 文件相比,该方法更加简便实用。
  3 C/C++调用Matlab
  在工程实践中,C/C++调用Matlab 的方法主要有调用Matlab 计算引擎、包含m 文件转 换的C/C++文件,以及调用m 文件生成的DLL 文件。
  3.1 利用Matlab 计算引擎
  Matlab 的引擎库为用户提供了一些接口函数,利用这些接口函数,用户在自己的程序 中以计算引擎方式调用Matlab 文件。该方法采用客户机/服务器的方式,利用Matlab 引擎 将Matlab 和C/C++联系起来。在实际应用中,C/C++程序为客户机,Matlab 作为本地服务器。
  C/C++程序向Matlab 计算引擎传递命令和数据信息,并从Matlab 计算引擎接收数据信息[2]。
  Matlab 提供了以下几个C 语言计算引擎访问函数供用户使用[8]:engOpen,engClose, engGetVariable,engPutVariable,engEvalString,engOutputBuffer,engOpenSingleUse, engGetVisible,engSetVisible。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !