您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 第7章 MATLAB与C语言接口(改)
第7章MATLAB与C语言接口MATLAB是矩阵语言,是为向量和矩阵操作设计的,一般来说,如果运算可以用向量或矩阵实现,其运算速度是非常快的。但若运算中涉及到大量的循环处理,MATLAB的速度的令人难以忍受的。解决方法之一为,当必须使用for循环时,把它写为MEX文件,这样不必在每次运行循环中的语句时MATLAB都对它们进行解释。•MATLAB作为世界顶尖的数学应用软件,以其强大的工程计算、算法研究、工程绘图、应用程序开发、数据分析和动态仿真等功能,在航空航天、机械制造和工程建筑等领域发挥着越来越重要的作用。而C语言功能丰富,使用灵活方便,目标程序效率高。既有高级语言的优点,又有低级语言的特点。因此,C语言是目前应用最广的编程语言。虽然MATLAB是一个完整的、功能齐全的编程环境,但在某些情况下,与外部环境的数据和程序的交互是非常必须而且有益的。•众所周知,MATLAB是用M语言编程,不能在M文件中直接调用C语言程序。可以通过MATLAB提供的应用编程接口(API)来实现与外部的接口,在MATLAB环境中实现调用C语言或Fortran程序、输入或输出数据以及和其他软件程序间建立客户/服务器关系等功能。•MATLAB中调用C语言程序,必须通过MEX文件来实现。•一、C语言的MEX文件的结构•C语言的MEX文件是一种动态连接子程序,可以象调用M文件一样调用它。MEX文件主要有以下几方面的应用:•(1)在MATLAB中,M文件的计算速度特别是循环迭代的速度远比C语言慢,因此可以把要求大量循环迭代的部分用C语言编写为MEX文件,提高计算速度。•(2)已经开发的C语言程序,则不必将其转化为M文件而重复劳动,通过添加入口程序mexFunction,可以由MATLAB调用。•(3)直接控制硬件,如A/D采集卡,D/A输出卡等,以用于数据采集或控制应用。•C语言的MEX文件的源程序由两个非常明显部分组成:•(1)计算程序,即在MEX文件中完成计算功能的程序代码,计算程序可以是普通的C语言程序,按照C语言规则编写即可•(2)入口程序,将计算程序与MATLAB连接的入口函数mexFunction。入口程序mexFunction相对要复杂一些,函数中有四个参数nlhs、plhs、nrhs和prhs。这里nlhs是输出数据的个数,plhs是指向mxArray(MATLAB中所有数据都由mxArray定义)的输出数据的指针,nrhs是输入数据的个数,prhs是指向mxArray的输入数据的指针。•二、使用MEX文件•上面所述的MEX文件的两个主要部分在使用中可以是独立的,也可以是组合在一起的。不管是哪一种情况,MEX文件都必须包含头文件mex.h,以便正常申明入口程序。入口程序的名字必须是mexFunction而且必须包含这些参数:•voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])•在C语言的MEX文件中,参数nlhs和nrhs包含输出和输入变量的数目,借助于这两个参数,MEX文件被调用。参数plhs和prhs是包含指向MEX文件输出和输入变量的指针的向量,prhs是长度为nrhs的输入变量的指针数组,plhs是长度为nlhs的输出变量的指针数组。比如从MATLAB命令窗口来调用一个MEX文件•MEX文件的计算过程和入口过程也可以合并在一起。但不管那种情况,都要包含#includemex.h,以保证入口点和接口过程的正确声明。注意,入口过程的名称必须是mexFunction,并且包含四个参数,即:•voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])•其中,参数nlhs和nrhs表示MATLAB在调用该MEX文件时等式左端和右端变量的个数,例如在MATLAB命令窗口中输入以下命令:•[a,b,c]=Matlab_1(d,e,f,g)•则nlhs为3,nrhs为4。•MATLAB在调用MEX文件时,输入和输出参数保存在两个mxArray*类型的指针数组中,分别为prhs[]和plhs[]。prhs[0]表示第一个输入参数,prhs[1]表示第二个输入参数,…,以此类推。如上例中,d→prhs[0],e→prhs[1],f→prhs[2],f→prhs[3]。同时注意,这些参数的类型都是mxArray*。•接口过程要把参数传递给计算过程,还需要从prhs中读出矩阵的信息,这就要用到下面的mx-函数和mex-函数。•三、常用的mex-函数•在MATLAB6.5版本中,mex-函数有38个,下面我们仅介绍常用的函数。•1.入口函数mexFunction•该函数是CMEX文件的入口函数,它的格式是固定的:•voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])•说明:•MATLAB函数的调用方式一般为:[a,b,c,…]=被调用函数名称(d,e,f,…),nlhs保存了等号左端输出参数的个数,指针数组plhs具体保存了等号左端各参数的地址,注意在plhs各元素针向的mxArray内存未分配,需在接口过程中分配内存;nrhs保存了等号右端输入参数的个数,指针数组prhs具体保存了等号右端各参数的地址,注意MATLAB在调用该MEX文件时,各输入参数已存在,所以在接口过程中不需要再为这些参数分配内存。•四、编译器的安装与配置•要使用MATLAB编译器,用户计算机上应用事先安装与MATLAB适配的以下任何一种ANSIC/C++编译器:•5.0、6.0版的MicroSoftVisualC++(MSVC)•5.0、5.2、5.3、5.4、5.5版的BorlandC++•LCC(由MATLAB自带,只能用来产生MEX文件)•五、安装与配置MATLAB编译器应用程序MEX的设置的步骤:(1)在MATLAB命令窗口中运行mex–setup,出现下列提示:Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikemextolocateinstalledcompilers[y]/n?(2)选择y,MATLAB将自动搜索计算机上已安装的外部编译器的类型、版本及所在路径,并列出来让用户选择:•Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:•Wouldyoulikemextolocateinstalledcompilers[y]/n?y•Selectacompiler:•[1]DigitalVisualFortranversion6.0inC:\ProgramFiles\MicrosoftVisualStudio•[2]LccCversion2.4inE:\MATLAB1022\sys\lcc•[3]MicrosoftVisualC/C++version6.0inC:\ProgramFiles\MicrosoftVisualStudio•[0]None•(3)选择其中一种(在这里选择了3),MATLAB让用户进行确认:•Compiler:MicrosoftVisualC/C++6.0•Location:C:\ProgramFiles\MicrosoftVisualStudio•Arethesecorrect?([y]/n):•(4)选择y,结束MATLAB编译器的配置。•Trytoupdateoptionsfile:C:\DocumentsandSettings\wym\ApplicationData\MathWorks\MATLAB\R14\mexopts.bat•Fromtemplate:E:\MATLAB1022\BIN\WIN32\mexopts\msvc60opts.bat••Done...••例1一个简单的MEX文件例子•【例1】用m文件建立一个1000×1000的Hilbert矩阵。•tic•m=1000;•n=1000;•a=zeros(m,n);•fori=1:1000•forj=1:1000•a(i,j)=1/(i+j);•end•end•toc•elapsed_time=•0.06200•在记事本中输入以下程序:•[Matlab_1.cpp]•#includemex.h•//计算过程•voidhilb(double*y,intn)•{•inti,j;•for(i=0;in;i++)•for(j=0;jn;j++)•*(y+j+i*n)=1/((double)i+(double)j+1);•}•//接口过程•voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])•{•doublex,*y;•intn;•if(nrhs!=1)•mexErrMsgTxt(Oneinputsrequired.);•if(nlhs!=1)•mexErrMsgTxt(Oneoutputrequired.);•if(!mxIsDouble(prhs[0])||mxGetN(prhs[0])*mxGetM(prhs[0])!=1)•mexErrMsgTxt(Inputmustbescalars.);•x=mxGetScalar(prhs[0]);•plhs[0]=mxCreateDoubleMatrix(x,x,mxREAL);•n=mxGetM(plhs[0]);•y=mxGetPr(plhs[0]);•hilb(y,n);•}•该程序是一个C语言程序,它也实现了建立Hilbert矩阵的功能。在MATLAB命令窗口输入以下命令:mexMatlab_1.cpp,即可编译成功。进入该文件夹,会发现多了两个文件:Matlab_1.asv和Matlab_1.dll,其中Matlab_1.dll即是MEX文件。运行下面程序:•tic•a=Matlab_1(1000);•toc•elapsed_time=•0.0320•由上面看出,同样功能的MEX文件比m文件快得多。7.2MATLAB计算引擎•MATLAB的计算引擎应用就是利用MATLAB提供的一组接口函数,在用户开发的C/C++语言应用程序中,通过某种通信机制后台调用MATLAB应用程序以完成复杂的系统任务。例7-3设计一程序,在C/C++语言中调用mesh函数来绘制高斯矩阵的曲面。解题步骤:7.3基于COM组件的接口编程该方法的主要特点有:(1)应用程序完全脱离MATLAB工作环境;(2)MATLAB数学库和工具箱中包括的各种各样的函数,所以降低了编写算法难度;(3)由于将算法程序做成了COM组件的形式,所以实现了算法的保密。7.4在C/C++语言中读写MAT数据文件支持C/C++语言读写MAT文件的函数库有下面几个:•1.打开数据文件──matOpen–MATFile*matOpen(constchar*filename,constchar*mode)•2.关闭数据文件──matClose–intmatClose(MATFile*mfp)•3.获取变量──matGetVariable–mxArray*matGetVariable(MATFile*mfp,constchar*name)•4.写入数据──matPutVariable–intmatPutVariable(MATFile*mfp,constchar*name,constmxArray*mp)应用举例例7-5在C/C++语言中调用MATLAB计算魔方阵,并将结果显示到屏幕。例7-4•实验七MATLAB与C语言接口编程(2学时)•1、目的要求•掌握MATLAB与C语言接口编程方法与应用。•2、主要实验仪器及材料•微型计算机、Matlab7.0教学版、TC编程环境。•3、掌握要点•掌握
本文标题:第7章 MATLAB与C语言接口(改)
链接地址:https://www.777doc.com/doc-3278532 .html