资源描述:
《而cc++是目前最为流行的高级程序设计语言,两者互补结》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序设计语言,两者互补结合的混合编程在科学研究和工程实践中具有非常重要的意义。从Matlab调用C/C++代码及C/C++调用m文件两方面,深入地研究了它们之间混合编程的原理和实现机制,并且给出了具体条件下的混合编程方法和步骤。实验表明,给出的Matlab与C/C++混合编程接口及应用方法是有效、实用的。1引言Matlab是当前应用最为广泛的数学软件,具有强大的数值计算、数据分析处理、系统分析、图形显示甚至符号运算等功能[
2、1]。利用这一完整的数学平台,用户可以快速实现十分复杂的功能,极大地提高工程分析计算的效率[2][3]。但与其他高级程序[3]相比,Matlab程序是一种解释执行程序,不用编译等预处理,程序运行速度较慢[4]。C/C++语言是目前最为流行的高级程序设计语言之一[5]。它可对操作系统和应用程序以及硬件进行直接操作,用C/C++语言明显优于其它解释型高级语言,一些大型应用软件如Matlab就是用C语言开发的。在工程实践中,用户经常遇到Matlab与C/C++混合编程的问题。本文基于Matlab6.5和VC6
3、.0开发环境,在Windows平台下就它们之间的混合编程问题进行深入研究并举例说明。2Matlab调用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是MatlabExecu
4、table的缩写,它是一种“可在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函数1
5、通过简单的例子说明C/C++的MEX源程序编写和调用过程:#include"mex.h"voidtimestwo(doubley[],doublex[]){y[0]=2.0*x[0];}voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[]){double*x,*y;intmrows,ncols;if(nrhs!=1)mexErrMsgTxt("Oneinputrequired.");elseif(nlhs>1)mexErrM
6、sgTxt("Toomanyoutputarguments");mrows=mxGetM(prhs[0]);ncols=mxGetN(prhs[0]);if(!mxIsDouble(prhs[0])
7、
8、mxIsComplex(prhs[0])
9、
10、!(mrows==1&&ncols==1))mexErrMsgTxt("Inputmustbeanoncomplexscalardouble.");plhs[0]=mxCreateDoubleMatrix(mrows,ncols,mxREAL);x=mxGetP
11、r(prhs[0]);y=mxGetPr(plhs[0]);timestwo(y,x);}用指令mextimestwo.c编译此文件,然后在MATLAB命令行下调用生成的MEX文件即可。2.2调用C/C++动态连接库Matlab提供对动态连接库DLL文件的接口[7]。利用该接口,可在Matlab中调用动态连接库导出的函数。Matlab对DLL的接口支持各种语言编写的DLL文件。在调用DLL文件之前,需要准备函数定义的头文件。对于C/C++语言开发的DLL文件,可使用源程序中相应的头文件;而对于其他语言开
12、发的DLL,则要手工准备等效的C语言函数定义头文件。在Matlab中利用动态连接库接口技术通常需要完成以下4个步骤:(1)打开动态连接库文件;(2)为调用函数准备数据;(3)调用动态连接库文件中导出的函数;(4)关闭动态连接库文件。为了实现以上步骤,用到的Matlab函数有:loadlibrary,loadlibrary,calllib,1libfunctions,lipointer,libstruct,libisloaded。下面举例说明