Matlab混合编程.docx
《Matlab混合编程.docx》由会员分享,可在线阅读,更多相关《Matlab混合编程.docx(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 专业实习 论 文题目: Matlab与C/C+混合编程技术 姓 名 魏安军 学 院 理学院 专 业 数学与应用数学 班 级 06201 学 号 060680 班内序号 07 2009年 8月摘要本文先通过介绍Matlab的接口技术引入Matlab与C/C+混合编程的先决条件,通过阐述不同编程环境下的缺点证实混合编程的需要,扬长避短发挥出Matlab与C/C+结合的最大优点。然后,本文对混合编程技术进行深入探究,具体到两种易可行的方法:MEX技术和调用Matlab计算引擎技术。在MEX技术中,主要是通过Matlab调用C/C+来实现,本文讲解了使用MEX文件的优点,这里主要包括代码重用,速度提
2、升,功能扩展。经过工作环境的设置后,通过两个简单的例子说明了C/C+语言MEX文件的基本写法和一些库函数的使用。在调用Matlab计算引擎技术中,主要是通过Visual C+编程环境来实现。本文先探讨了使用该引擎的优点集中在两个方面:强大的矩阵计算能力和图形显示能力。然后简单介绍了引擎库函数的原型和功能和调用Matlab引擎时的环境配置。最后通过Visual C+调用Matlab引擎的实例来说明混合编程的高效。1. 背景知识1.1. 关于MATLAB的接口技术Matlab是美国Mathworks公司开发和发行的一个软件产品。它是一个交互式的开发系统,具有强大的数值计算和图形显示能力,以及易用的
3、编程开发语言。现在的Matlab接口技术包括如下几个方面的内容:l 数据的导入导出。这些技术主要包括在Matlab环境里利用MAT文件技术来进行数据的导入导出。l 和普通的动态链接库(DLL)文件的接口l 在Matlab环境里调用C/C+,FORTRAN语言代码的接口。这个接口是通过MEX技术实现的。利用MEX技术,C/C+或者FORTRAN代码通过实现一个特殊的入口函数,就能够被编译成MEX文件。l 在Matlab调用Java。从v6.0版本之后的Matlab都包含一个Java虚拟机器,所以用户可以通过Matlab命令来使用Java语言解释器,从而实现对Java对象的调用。l 对COM和DD
4、E的支持。l 在Matlab实用网络服务。l 和串行口的通信接口Matlab给用户提供了如上非常丰富的接口技术,包括和其它语言程序的接口,真正实现在不同程序之间共享数据的接口,使得编程和计算的效率大幅度的提高。1.2. 关于MATLAB与C/C+混合编程虽然Mtalab是以矩阵为基本运算单位的高效数值计算软件,带有功能强大的数学函数库,并开发有多种学科领域的工具箱函数库,广泛地应用与科学研究与工程计算,然而其自身存在的一些缺点限制了它在更多方面的应用:l Matlab程序不能脱离其运行环境,可移植性差。l Matlab是一种解释性语言,语言执行效率低,实时性较差。l Matlab的界面开发能力
5、较差,难以开发出友好的应用界面。l Matlab编写的M文件是文本文件,容易被直接读取,难以保护劳动者的成果。Visual C+用于面向对象的可视化编程,可以完成从底层软件直到面向用户软件等各种应用程序的开发。利用它提供的各种实用工具,开发者可以轻松开出高效强大的Windows应用程序。但在实际工程开发中,与Matlab相比:l Visual C+在数值处理分析和算法工具等方面不如Matlab。l Visual C+在准确方面地绘制数据图形(数据可视化)方面不如Matlab。因此,把Matlab在数值计算、算法设计以及数据可视化等领域的优势与VC+应用系统集成,不仅可以完全满足系统在数据运算与
6、表现方面的需求,而且还可提高系统处理的效率和稳定性,同时也减少了开发人员实现算法的困难,缩短了软件开发的周期,提高了软件质量,在实践中具有很高的使用价值。2. MATLAB调用C/C+2.1. MEX技术概述MEX代表Matlab Executable。MEX文件是一种特殊的动态连接库函数,它能够在Matlab里像一般的M函数那样来执行。MEX文件必须导出一个特殊的函数以作为在Matlab中使用的接口,另外也可以包含一个或多个用户自己定义的函数。MEX文件可以通过编译C/C+,或者FORTRON源文件来产生。因此,使用文件给用户提供了一种在Matlab使用其它编程语言的途径。一般来说,使用ME
7、X文件的优点包括:l 代码重用。通过MEX方式,用户可以实现在Matlab中使用已有的代码l 速度提升。一些复杂的算法使用C/C+或者FORTRON开发,有可能加速程序的运行速度。l 功能扩展。通过MEX方式,用户可以调用系统函数或者实现和硬件的交互,从而扩展程序功能。MEX文件在不同计算机操作系统上的后缀名不同,我们这里只讨论在Windows上的,MEX文件的后缀名和普通动态链接库一样,也是dll。在相应的平台上,Matlab能自动检测到MEX文件的存在。和普通的M文件一样,只要MEX文件在Matlab的搜索路径上,那么在Matlab命令行输入某个MEX文件名(不带后缀名)就能够执行该MEX
8、文件。2.2. 工作环境的设置MEX文件是通过编译相应的C/C+或FORTRON源程序产生的。Matlab对MEX文件的支持是内置的,并不需要特殊的工具箱或者Matlab编译器。不过Matlab需要使用外部编译器来完成对源程序的编译。在安装完Matlab和所需的编译器后,需要配置MEX编译环境。Matlab编译MEX文件的命令是mex。在使用mex命令编译之前,需要先在Matlab命令行用下面的命令配置编译环境: mex setup这个命令将会自动检测当前计算机上已经安装的它所支持的编译器,并将其在命令行中罗列出来,用户可以选择使用哪个编译器来编译MEX文件。本论文针对Visual C+,一种
9、在Windows平台使用极其广泛的C/C+编译器,来介绍如何配置mex命令。下图是从Matlab 7.7.0命令行环境复制得到,它演示了配置的大致流程。图 1 配置mex命令流程可以看出,Matlab能够自动检测到本地计算机上已经安装了Visual C+ 6.0,在加上Matlab自己提供的Lcc编译器。然后选择了第二个也就是VC+ 6.0,Matlab会自动搜索到所选编译器的路径,根据配置文件的模版,最终产生名为mexopts.bat的配置文件。上面例子中,mexopts.bat的路径为:C:Documents and SettingswuhaoApplication DataMathWor
10、ksMATLABR2008bmexopts.bat。下图主要显示了mex命令的简单格式,和帮助命令的格式。关于更多mex命令的语法可以通过帮助文件获得,这里就不在赘述。图 2 mex命令使用格式2.3. C/C+语言MEX文件一个C/C+ MEX源程序通常包括如下4个部分,其中前面3个是必须包含的内容,至于第4个,则根据所实现的功能可以灵活选用。(1) #include mex.h(2) MEX文件的入口函数mexFunction(3) mexArray(4) API函数其中,mex.h是一个头文件,它给出了以mx,mex打头的API函数的定义。每个C+语言MEX源程序都必须包含它,否则编译过
11、程无法顺利完成。MEX文件其实是个动态连接库文件。它只导出一个函数mexFunction。当在Matlab命令行调用编译好的MEX文件时,只需要直接输入MEX文件的名字(不包括后缀名)即可。假设MEX文件名为myfun.dll,那么可以在Matlab环境用类似“输出变量=myfun(输入参数)”的形式来调用myfun.dll。在C+语言中,mexFunction的定义如下:void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs );nrhs是个整数,表示调用形式中等号左边的变量的数目,也就是调用形式中输出变
12、量的个数。plhs 是一个关于指向mxArray变量指针的数组,数组长度和nrhs相同,数组中元素排列顺序按照调用时输出参数从左到右排列。nrhs也是整数,表示在调用形式中等号右边的参数个数,也就是输入参数的数目。prhs也是一个关于指向mxArray变量指针的数组,其长度和nrhs相同。prhs中的各元素的排列顺序按照调用时输入参数从左到右排列。nlhs和nrhs都可以为0,Matlab限制了它们的最大值为50。数据类型mxArray是在matrix.h中定义的,是一个结构体(struct)。Matlab的所有变量类型,无论是标量还是向量或者矩阵都可以在C+用mxArray来描述。它是在Ma
13、tlab和C+程序交换数据的桥梁。C+程序必须使用mxArray来访问Matlab各种数据类型。同时,Matlab也只能通过mxArray和C+程序交换数据。l 下面对mex.h中定义的部分C-MEX函数的原型和功能进行说明。若读者想了解更多,可以去查阅相关头文件。1 mexErrMsgTxt()原型:void mexErrMsgTxt(const char *error_msg);功能描述:发出报错信息,然后返回Matlab提示符。2 mexErrMsgAndTxt()原型:void mexErrMsgAndTxt(const char *identifier, const char *er
14、r_msg, )功能描述:按指定的格式发出报错信息,并返回Matlab提示符。3 mexWarnMsgTxt()原型:void mexWarnMsgTxt(const char *warn_msg)功能描述:触发一个没有定义标示的告警信息。4 mexWarnMsgIdAndTxt()原型:void mexWarnMsgIdAndTxt(const char *identifier, const char *warn_msg)功能描述:按指定得格式发出告警信息,并返回Matlab提示符。5 mexPrintf()原型:int mexPrintf(const char *fmt, );功能描述:相
15、当于Matlab中的disp命令。在mex.h中有以下语句,将printf语句按mexPrintf执行。6 mexMakeArrayPersistent()原型:void mexMakeArrayPersistent(mx Array *pa);功能描述:从Matlab的内存分配表中删除矩阵的所有组件,包含矩阵头本身。当删除一个矩阵时必须调用mxDestroyArray()函数。7 mexMakeMemory Persistent()原型:void mexMakeMemory Persistent(void *ptr)功能描述:从Matlab的内存分配表中去除前面通过mxAlloc()分配的内
16、存。为了释放内存,需要调用mxFree()函数。8 mexGetFunctionHandle()原型:void mexGetFunctionHandle(void)功能描述:查找一个函数,并返回可与mexCallMATLABFuntion一起使用的函数句柄。9 mexCallMATLABFunction()原型:void mexCallMATLABFunction(void)功能描述:执行一个函数,函数句柄是通过mexGetFunctionHandle得到的。10. mexRegisterFunction()原型:void mexRegisterFunction(void)功能描述:记录一个函
17、数指针,作为MATLAB可调用函数。l 下面的例子非常简单,类似在学习其它编程语言时常用的“Hello World!”程序,功能是在命令行输出一串字符。首先创建一个C+语言源程序myhello.cpp,然后加入如下内容:【例1】myhello#include mex.hvoid mxFunction(int nlhs, mxArray *plhs , int nrhs, const mxArray *prhs )mexPrintf(Hello World!n);写好程序保存后,在Matlab命令行切换到myhello.cpp所在的目录,然后用如下的命令进行编译: mex myhello.cpp
18、如果在Windows上,将得到一个DLL文件:myhello.dll,这就是编译好的MEX文件。运行结果如下: myhelloHello World!Matlab API提供了一系列程序来处理Mtalab所支持的各种数据类型,每一种数据类型都有对应函数来处理对应的数据。下面给出一个简单的C语言程序和与之对应的MEX文件代码,改程序的功能是将标量x加倍。【例2】timestwoC语言程序如下:#include math.hvoid timestwo(doule y, doule x)y0=2.0*x0;return;下面是与C语言程序功能相同的MEX文件:#include mex.hvoid t
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 混合 编程
限制150内