MATLAB自学专业知识讲座_第1页
MATLAB自学专业知识讲座_第2页
MATLAB自学专业知识讲座_第3页
MATLAB自学专业知识讲座_第4页
MATLAB自学专业知识讲座_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章MATLAB与C语言接口

MATLAB是矩阵语言,是为向量和矩阵操作设计,一般来说,假如运算能够用向量或矩阵实现,其运算速度是非常快。但若运算中包括到大量循环处理,MATLAB速度令人难以忍受。处理办法之一为,当必须使用for循环时,把它写为MEX文献,这样无须在每次运行循环中语句时MATLAB都对它们进行解释。第1页MATLAB作为世界顶尖数学应用软件,以其强大工程计算、算法研究、工程绘图、应用程序开发、数据分析和动态仿真等功能,在航空航天、机械制造和工程建筑等领域发挥着越来越主要作用。而C语言功能丰富,使用灵活方便,目标程序效率高。现有高级语言长处,又有低级语言特点。因此,C语言是目前应用最广编程语言。虽然MATLAB是一种完整、功能齐全编程环境,但在某些情况下,与外部环境数据和程序交互是非常必须并且有益。众所周知,MATLAB是用M语言编程,不能在M文献中直接调用C语言程序。能够通过MATLAB提供应用编程接口(API)来实现与外部接口,在MATLAB环境中实现调用C语言或Fortran程序、输入或输出数据以及和其他软件程序间建立客户/服务器关系等功能。

MATLAB中调用C语言程序,必须通过MEX文献来实现。第2页一、C语言MEX文献构造C语言MEX文献是一种动态连接子程序,能够象调用M文献同样调用它。MEX文献主要有下列几方面应用:(1)在MATLAB中,M文献计算速度尤其是循环迭代速度远比C语言慢,因此能够把要求大量循环迭代部分用C语言编写为MEX文献,提升计算速度。(2)已经开发C语言程序,则无须将其转化为M文献而反复劳动,通过添加入口程序mexFunction,能够由MATLAB调用。(3)直接控制硬件,如A/D采集卡,D/A输出卡等,以用于数据采集或控制应用。第3页C语言MEX文献源程序由两个非常显著部分组成:

(1)计算程序,即在MEX文献中完成计算功能程序代码,计算程序能够是一般C语言程序,按照C语言规则编写即可

(2)入口程序,将计算程序与MATLAB连接入口函数mexFunction。入口程序mexFunction相对要复杂某些,函数中有四个参数nlhs、plhs、nrhs和prhs。这里nlhs是输出数据个数,plhs是指向mxArray(MATLAB中所有数据都由mxArray定义)输出数据指针,nrhs是输入数据个数,prhs是指向mxArray输入数据指针。第4页二、使用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文献第5页MEX文献计算过程和入口过程也能够合并在一起。但不论那种情况,都要包括#include"mex.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。第6页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-函数。第7页三、常用mex-函数在MATLAB6.5版本中,mex-函数有38个,下面我们仅介绍常用函数。1.入口函数mexFunction该函数是CMEX文献入口函数,它格式是固定:voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])第8页说明:MATLAB函数调用方式一般为:[a,b,c,…]=被调用函数名称(d,e,f,…),nlhs保存了等号左端输出参数个数,指针数组plhs详细保存了等号左端各参数地址,注意在plhs各元素针向mxArray内存未分派,需在接口过程中分派内存;nrhs保存了等号右端输入参数个数,指针数组prhs详细保存了等号右端各参数地址,注意MATLAB在调用该MEX文献时,各输入参数已存在,因此在接口过程中不需要再为这些参数分派内存。第9页四、编译器安装与配备要使用MATLAB编译器,顾客计算机上应用事先安装与MATLAB适配下列任何一种ANSIC/C++编译器:5.0、6.0版MicroSoftVisualC++(MSVC)5.0、5.2、5.3、5.4、5.5版BorlandC++LCC(由MATLAB自带,只能用来产生MEX文献)第10页五、安装与配备MATLAB编译器应用程序MEX设置步骤:

(1)在MATLAB命令窗口中运行mex–setup,出现下列提醒:Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikemextolocateinstalledcompilers[y]/n?(2)选择y,MATLAB将自动搜索计算机上已安装外部编译器类型、版本及所在途径,并列出来让顾客选择:Pleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikemextolocateinstalledcompilers[y]/n?ySelectacompiler:[1]DigitalVisualFortranversion6.0inC:\ProgramFiles\MicrosoftVisualStudio[2]LccCversion2.4inE:\MATLAB1022\sys\lcc[3]MicrosoftVisualC/C++version6.0inC:\ProgramFiles\MicrosoftVisualStudio[0]None第11页(3)选择其中一种(在这里选择了3),MATLAB让顾客进行确认:Compiler:MicrosoftVisualC/C++6.0Location:C:\ProgramFiles\MicrosoftVisualStudioArethesecorrect?([y]/n):(4)选择y,结束MATLAB编译器配备。Trytoupdateoptionsfile:C:\DocumentsandSettings\wym\ApplicationData\MathWorks\MATLAB\R14\mexopts.batFromtemplate:E:\MATLAB1022\BIN\WIN32\mexopts\msvc60opts.bat

Done...

第12页例1一种简单MEX文献例子【例1】用m文献建立一种1000×1000Hilbert矩阵。ticm=1000;n=1000;a=zeros(m,n);fori=1:1000

forj=1:1000

a(i,j)=1/(i+j);

endendtocelapsed_time=

0.06200第13页在记事本中输入下列程序:[Matlab_1.cpp]#include"mex.h"//计算过程voidhilb(double*y,intn){

inti,j;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

*(y+j+i*n)=1/((double)i+(double)j+1);}第14页//接口过程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);}

第15页该程序是一种C语言程序,它也实现了建立Hilbert矩阵功能。在MATLAB命令窗口输入下列命令:mexMatlab_1.cpp,即可编译成功。进入该文献夹,会发觉多了两个文献:Matlab_1.asv和Matlab_1.dll,其中Matlab_1.dll即是MEX文献。运行下面程序:tica=Matlab_1(1000);tocelapsed_time=

0.0320

由上面看出,同样功能MEX文献比m文献快得多。第16页7.2MATLAB计算引擎MATLAB计算引擎应用就是利用MATLAB提供一组接口函数,在顾客开发C/C++语言应用程序中,通过某种通信机制后台调用MATLAB应用程序以完成复杂系统任务。第17页例7-3设计一程序,在C/C++语言中调用mesh函数来绘制高斯矩阵曲面。解题步骤:第18页7.3基于COM组件接口编程该办法主要特点有:(1)应用程序完全脱离MATLAB工作环境;(2)MATLAB数学库和工具箱中包括多种各样函数,因此减少了编写算法难度;(3)由于将算法程序做成了COM组件形式,因此实现了算法保密。第19页7.4在C/C++语言中读写MAT数据文献支持C/C++语言读写MAT文献函数库有下面几个:1.打开数据文献──matOpenMATFile*matOpen(constchar*filename,constchar*mode)2.关闭数据文献──matCloseintmatClose(MATFile*mfp)3.获取变量──matGetVariablemxArray*matGetVariable(MATFile*mfp,constchar*name)4.写入数据──matPutVariableintmatPutVariable(MATFile*mfp,constchar*name,constmxArray*mp)第20页应用举例例7-5在C/C++语言中调用MATLAB计算魔方阵,并将成果显示到屏幕。第21页例7-4第22页试验七MATLAB与C语言接口编程(2学时)1、目标要求掌握MATLAB与C语言接口编程办法与应用。2、主要试验仪器及材料微型计算机、Matlab7.0教学版、TC编程环境。3、掌握重点掌握用MATLAB与C接口编程办法,重点是C语言调用MATLAB。4、试验内容(1)、完成matlab对C函数调用;(2)、完成C语言对matlab函数调用;(3)、对办法进行总结完成试验报告;第23页学好计算机唯一途径是

你编程能力与你

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论