MATLAB基础与实例进阶-03_第1页
MATLAB基础与实例进阶-03_第2页
MATLAB基础与实例进阶-03_第3页
MATLAB基础与实例进阶-03_第4页
MATLAB基础与实例进阶-03_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

2023/9/25机械工业出版社Page1第3章MATLAB程序设计基础【学习目标】了解M文件的基本知识掌握MATLAB程序的流程控制熟悉变量与函数的使用熟悉内存的管理与优化熟悉MATLAB面向对象程序设计2023/9/25机械工业出版社Page2第3章网络操作系统概述M文件介绍3.1流程控制3.2变量和函数3.3串演算函数3.4内存的使用3.5MATLAB面向对象程序设计3.62023/9/25机械工业出版社Page33.1M文件介绍3.1.1M文件编辑器3.1.2脚本M文件3.1.3函数M文件2023/9/25机械工业出版社Page41.M文件编辑器2023/9/25机械工业出版社Page5M文件的基本内容:函数声明行H1行帮助文档注释M文件正文2023/9/25机械工业出版社Page6

脚本M文件通常为一连串的指令,无输入输出参数。脚本M文件与MATLAB主界面共享工作空间,产生的数据和结果都保存在工作空间中。2.脚本M文件2023/9/25机械工业出版社Page7【例3-1】脚本M文件示例。clc;clearall;closeall;fs=200;t=0:1/fs:1;y=sin(2*pi*20*t);%产生正弦函数z=cos(2*pi*10*t);%产生余弦函数x=y+z;2.脚本M文件2023/9/25机械工业出版社Page8

函数M文件将程序进行抽象封装,提供了参数的入口,并可返回结果,其他M文件可以对函数M文件进行调用。3.函数M文件2023/9/25机械工业出版社Page9【例3-2】函数M文件示例:将十进制数转换成二进制向量。%deci2bin.m%functiony=deci2bin(x,n)%Thisfunctionconvertthedecimatenumbertobinaryvector%Input:%x:thedecimatenumber%n:thebitnumber%Output:%y:outputabinaryvector%Copyright:wudi,Nov.20103.函数M文件2023/9/25机械工业出版社Page10%InformationEngineeringUniversityy=zeros(1,n);i=1;whilex>=0&i<=ny(i)=rem(x,2);x=(x-y(i))/2;i=i+1;endy=y(n:-1:1);3.函数M文件2023/9/25机械工业出版社Page113.2流程控制3.2.1顺序结构3.2.2条件控制结构3.2.3循环控制结构3.2.4程序终止控制3.2.5错误控制结构3.2.6人机交互命令2023/9/25机械工业出版社Page12

顺序结构是程序语句中最基本的结构,这种结构不需要任何流程控制,按照顺序逻辑思路来编写程序,程序的执行顺序从上到下依次执行。1.顺序结构2023/9/25机械工业出版社Page131.顺序结构【例3-3】顺序结构语句示例。%example3_3.m%clc;clearall;closeall;symsx;s1=2*x;s2=3*s1^2+4*x;s=s1+s2程序运行结果如下:s=12*x^2+6*x2023/9/25机械工业出版社Page142.条件控制结构if语句和switch语句:if、else、elseif语句switch、case、otherwise语句2023/9/25机械工业出版社Page152.条件控制结构【例3-4】多重if…elseif语句示例。%pdbsline.m%functionf=pdbsline(x)%B样条函数的判断函数ifx<0f=0;elseifx<1f=x;elseifx<2f=2-x;elsef=0;end2023/9/25机械工业出版社Page162.条件控制结构【例3-5】switch语句使用示例:对于一个给定的百分数成绩,输出相应的等级成绩。%marks.m%functionmarks(score)num=(score-rem(score,10))/10;switchnum%switch语句case9disp('优秀');case8disp('良好');case7disp('中等');2023/9/25机械工业出版社Page172.条件控制结构case6disp('及格');otherwisedisp('不及格');end2023/9/25机械工业出版社Page183.循环控制结构for循环while循环continue语句break语句2023/9/25机械工业出版社Page193.循环控制结构for语句的语法形式如下:forindex=初始值:增量:结束值programstatements:end【例3-6】for循环使用示例:利用双重循环为二维矩阵赋值。clc;clearall;closeall;fori=1:3forj=1:3a(i,j)=1/(i+j-1);endend2023/9/25机械工业出版社Page203.循环控制结构while语句的语法形式如下:whileexpressionprogramstatements:end2023/9/25机械工业出版社Page213.循环控制结构【例3-7】while循环使用示例:求多项式x3-2x-5的根。a=0;fa=-Inf;b=3;fb=Inf;whileb-a>eps*b%while循环条件x=(a+b)/2;fx=x^3-2*x-5;ifsign(fx)==sign(fa)a=x;fa=fx;elseb=x;fb=fx;endend2023/9/25机械工业出版社Page223.循环控制结构continue语句用在循环结构中,表示当前循环不再继续,而是直接跳到下一次循环中。当有嵌套循环时,continue语句只与和自己最近的一个for或while循环有关。【例3-8】continue语句使用示例:用continue语句计算1~100之间所有的偶数相加之和。sum=0;fori=1:100ifrem(i,2)==1continue;%跳过后面的语句进行下一次循环endsum=sum+i;end2023/9/25机械工业出版社Page233.循环控制结构break语句用于终止for循环或while循环。当程序运行到break语句时,程序将跳出最近的循环体,执行循环体后面的语句。【例3-9】break语句使用示例:用break语句求多项式x3-2x-5的根。%example3_9.m%clc;clearall;closeall;a=0;fa=-Inf;b=3;fb=Inf;2023/9/25机械工业出版社Page243.循环控制结构whileb-a>eps*bx=(a+b)/2;fx=x^3-2*x-5;iffx==0break %跳出循环elseifsign(fx)==sign(fa)a=x;fa=fx;elseb=x;fb=fx;endend2023/9/25机械工业出版社Page254.程序终止控制

程序终止控制使用return语句,用于结束函数的执行,返回到主调函数中。【例3-10】return语句使用示例:计算矩阵的特征值,当输入为空矩阵时用return跳出。functiond=det(A)ifisempty(A)d=1;returnelse...end2023/9/25机械工业出版社Page265.错误控制结构

错误控制结构使用try-catch语句,它是选择结构的一种特殊形式。try-catch语句用来捕捉并处理异常。其语法形式如下:trystatement1%Trytoexecutestatement1catchtrystatement2%Attempttorecoverfromerrorcatchdisp'Operationfailed'%Handletheerrorendend2023/9/25机械工业出版社Page275.错误控制结构【例3-11】try-catch语句使用示例。clc;clearall;closeall;a=[1-325];tryindex=input('Entersubscriptofelementtodisplay:');%显示向量中元素disp(['a('int2str(index)')='num2str(a(index))]);catchdisp(['Illegalsubscript:'int2str(index)]);%出现错误情况end2023/9/25机械工业出版社Page286.人机交互命令input命令语法形式如下:evalResponse=input(prompt)strResponse=input(prompt,'s')prompt:表示要在屏幕上显示的字符串;'s':表示无论输入什么内容,总是以字符串的形式赋给变量strResponse。2023/9/25机械工业出版社Page296.人机交互命令keyboard命令 keyboard命令与input命令类似,当程序运行到keyboard命令时,程序将停止执行,将控制权交给键盘,并显示提示符K等待用户的输入。当处理完后,输入return指令,然后按回车键,将结束键盘模式继续执行下面的程序;2023/9/25机械工业出版社Page306.人机交互命令pause命令语法形式如下:pause:暂停执行程序,等待用户按任意键继续;pause(n):程序暂停n秒后继续执行;pauseon:允许其后连续的pause命令执行暂停程序;pauseoff:使其后连续的pause命令变得无效。2023/9/25机械工业出版社Page316.人机交互命令error命令语法形式如下:error('msgString')error('msgString',v1,v2,...)error('msgIdent','msgString',v1,v2,...,vN)error(msgStruct)msgString:表示显示出错的消息;v1,v2,…:显示的消息包含转换格式的字符;msgIdent:给每个错误信息绑定唯一的标识符或消息ID;msgStruct:表示消息的结构体。2023/9/25机械工业出版社Page326.人机交互命令echo命令echoon:打开echo状态,在脚本文件中显示其后所有被

执行的命令;echooff:关闭echo状态,在脚本文件中显示该语句前的

被执行命令,而不显示其后的执行命令;echo:在echoon与echooff两种状态之间转换;2023/9/25机械工业出版社Page333.3变量和函数3.3.1全局变量和局部变量3.3.2变量的传递3.3.3主函数和子函数3.3.4私有函数3.3.5嵌套函数3.3.6重载函数3.3.7匿名函数2023/9/25机械工业出版社Page34

变量按其作用域,可以分为局部变量和全局变量,如果一个函数内的变量没有特别的声明,那么这个变量为局部变量。如果需要使用全局变量,应当使用global声明而且在任何使用该全局变量的函数中都应加以定义。其语法形式如下: globalXYZ1.全局变量和局部变量2023/9/25机械工业出版社Page351.全局变量和局部变量【例3-15】局部变量与全局变量使用示例。%global_plot.m%functionglobal_plot()globalX%定义X为全局变量plot_sin(2)plot_cos(2)functionplot_sin(a)globalX%使用全局变量X时也要用global定义y=a*sin(X);figureplot(X,y)2023/9/25机械工业出版社Page361.全局变量和局部变量functionplot_cos(a)globalX%使用全局变量X时也要用global定义X=-2*pi:0.1:2*pi;%全局变量被修改z=exp(a); %定义局部变量y=z*cos(X);figureplot(X,y)程序运行结果如下:>>globalXX=0:0.1:4*pi;global_plot()2023/9/25机械工业出版社Page372.变量的传递几个针对输入输出参数的函数检查函数参数个数:nargin、argout可选输入输出参数:varargin、varargout2023/9/25机械工业出版社Page38【例3-16】函数参数传递使用示例。%sample.m%functionout=sample(a,b)fprintf('InSample:a=%0.1f,b=%0.1f\n',a,b);a=b+2*a;b=a.*b;out=a+b;fprintf('InSample:a=%0.1f,b=%0.1f\n',a,b);2.变量的传递2023/9/25机械工业出版社Page39在命令窗口输入以下命令:>>a=5;b=7;fprintf('Beforesample:a=%0.1f,b=%0.1f\n',a,b);out=sample(a,b);fprintf('Aftersample:a=%0.1f,b=%0.1f\n',a,b);fprintf('Aftersample:out=%0.1f\n',out);程序运行结果如下:Beforesample:a=5.0,b=7.0InSample:a=5.0,b=7.0InSample:a=17.0,b=119.0Aftersample:a=5.0,b=7.0Aftersample:out=136.02.变量的传递2023/9/25机械工业出版社Page40【例3-17】nargin和nargout函数使用示例。%myplot.m%function[x0,y0]=myplot(x,y,npts,angle,subdiv)%MYPLOTPlotafunction.%MYPLOT(x,y,npts,angle,subdiv)%Thefirsttwoinputargumentsare%required;theotherthreehavedefaultvalues.ifnargin<5,subdiv=20;endifnargin<4,angle=10;endifnargin<3,npts=25;end…2.变量的传递2023/9/25机械工业出版社Page41ifnargout==0plot(x,y)elsex0=x;y0=y;end2.变量的传递2023/9/25机械工业出版社Page42【例3-18】varargin函数使用示例:利用varargin实现输入任意多个学生的各科成绩,求各科成绩的平均值。%avg_mark.m%function[mathavg,chineseavg,englishavg]=avg_mark(varargin)L=length(varargin);fprintf('theinputvariablenumberis:%d\n',L);mathsum=0;%数学总成绩初始值chinesesum=0;%语文总成绩初始值englishsum=0;%英语总成绩初始值2.变量的传递2023/9/25机械工业出版社Page43fori=0:Lmathsum=mathsum+varargin{i}(1);chinesesum=chinesesum+varargin{i}(2);englishsum=englishsum+varargin{i}(3);endmathavg=mathsum/L;%平均值chineseavg=chinesesum/L;englishavg=englishsum/L;fprintf('themathavgis:%f\n',mathavg);fprintf('thechineseavgis:%f\n',chineseavg);fprintf('theenglishavgis:%f\n',englishavg);2.变量的传递2023/9/25机械工业出版社Page44在命令窗口中调用此函数并运行,程序运行结果如下:>>avg_mark([89,90,78],[75,80,86],[90,88,82]);theinputvariablenumberis:3themathavgis:84.666667thechineseavgis:86.000000theenglishavgis:82.0000002.变量的传递2023/9/25机械工业出版社Page45 MATLAB中的主函数是针对其内部嵌套函数和子函数而言的。每一个函数M文件的第一行定义的函数就是主函数,除了主函数外,还可以编写多个嵌套函数或子函数,以便在主函数功能实现中进行调用。3.主函数和子函数2023/9/25机械工业出版社Page46

私有函数是具有限制性访问权限的函数,它对应的M文件保存在private的文件夹下。私有函数只有private目录的父目录中的函数才可以调用,其他目录的函数不能调用。4.私有函数2023/9/25机械工业出版社Page47 MATLAB中的嵌套函数是指定义在其他函数内部的函数。

5.嵌套函数嵌套函数的常用语法形式如下:functionx=A(p1,p2)...functiony=B(p3)...end...end2023/9/25机械工业出版社Page48

函数重载主要用在实现处理功能相似而参数类型或个数不同的函数编写中。

MATLAB中的重载函数通常放置在不同的文件夹下,文件夹名称以符号@开头,然后跟一个代表MATLAB数据类型的字符。如@double目录下的重载函数的输入参数应该是双精度浮点型,而@int32目录下的重载函数输入参数应该是32位整型。

6.重载函数2023/9/25机械工业出版社Page49

匿名函数是面向命令行代码的函数形式,它通常只由一句很简单的声明语句组成。

7.匿名函数匿名函数创建的语法形式如下:

fhandle=@(arglist)exprexpr:通常是一个简单的MATLAB变量表达式,实现函数的

功能,比如x.^2;arglist:参数列表,它指定函数的输入参数列表,对于多个

输入参数的情况,通常要用逗号分隔各个参数;符号@:MATLAB中创建函数句柄的操作符,表示创建由输

入参数列表arglist和expr确定的函数句柄,并把这个函数句柄返回给变量fhandle,这样以后就可以通过fhandle来调用定义好的这个函数。2023/9/25机械工业出版社Page507.匿名函数【例3-21】匿名函数使用示例。>>A=[234];B=[567];>>sumAxBy=@(x,y)(A*x+B*y)sumAxBy=@(x,y)(A*x+B*y)>>sumAxBy(5,7)ans=4557692023/9/25机械工业出版社Page513.4串演算函数3.4.1eval函数3.4.2inline函数2023/9/25机械工业出版社Page521.eval函数

eval函数的功能就是将括号内的字符串视为语句并运行,其语法形式如下:eval(expression)[a1,a2,a3,...]=eval('myfun(b1,b2,b3,...)‘)【例3-22】eval函数使用示例:使用eval函数计算字符串。%example3_22.m%clc;clearall;closeall;x=pi;eval('theta=2*x,y=cos(theta)');程序运行结果如下:theta=6.2832y=12023/9/25机械工业出版社Page532.inline函数 对于一些较短的函数可以直接使用inline定义为内联函数,这样就不需要将其单独存储为M文件,提高了程序的灵活性。inline(expr):将字符串表达式转换为输入变量自动生成的

内联函数;inline(expr,arg1,arg2,...):将字符串表达式转换为arg1、 arg2输入变量自动生成的内联函数;inline(expr,n):将字符串表达式转换为x、p1、p2…pn输

入变量自动生成的内联函数;inline语句得到的返回类型是'inlineobject'。2023/9/25机械工业出版社Page543.5内存的使用3.5.1内存管理函数3.5.2高效使用内存的策略2023/9/25机械工业出版社Page551.内存管理函数whos函数:显示工作区间中的变量分配了多少内存;pack函数:把已经存在的变量保存到磁盘中,然后

重新装入,可以有效减少因为内存碎片

出问题的几率;clear函数:从内存中删除变量,释放出一些内存空

间;save函数:有选择地把变量保存到磁盘;load函数:把已保存的数据文件重新载入到工作区间;quit函数:退出MATLAB并释放所有分配的内存。2023/9/25机械工业出版社Page562.高效使用内存的策略变量的内存分配使用pack整理内存空间及时保存变量,需要时再读出来使用单精度短整数替代双精度把满秩矩阵转换为稀疏矩阵数组结构和结构数组2023/9/25机械工业出版社Page572.高效使用内存的策略【例3-25】内存使用示例:预置内存与动态分配。程序段一:动态分配内存forn=2:1000x(n)=x(n-1)+10;end程序段二:预置内存x=zeros(1,1000);fork=2:1000x(n)=x(n-1)+10;end2023/9/25机械工业出版社Page582.高效使用内存的策略【例3-26】内存使用示例:尽早为大矩阵变量预置内存。程序段一:a=rand(1e6,1);b=rand(1e6,1);clearc=rand(2.1e6,1);程序段二:c=rand(2.1e6,1);cleara=rand(1e6,1);b=rand(1e6,1);2023/9/25机械工业出版社Page592.高效使用内存的策略【例3-26】内存使用示例:比较两个1000×1000的矩阵X和Y。其中X为单位矩阵,Y为X的稀疏形式。X=eye(1000,1000);Y=sparse(X);whos内存占用空间如下:NameSizeBytesClassAttributesX1000x10008000000doubleY1000x100016004doublesparse可以看出,采用稀疏矩阵的存储形式可以有效减少内存空间。2023/9/25机械工业出版社Page603.6

MATLAB面向对象程序设计3.6.1面向对象基础3.6.2MATLAB类的定义3.6.3MATLAB对象的使用3.6.4面向对象程序实例2023/9/25机械工业出版社Page611.面向对象基础对象类封装继承多态性2023/9/25机械工业出版社Page622.MATLAB类的定义两个步骤:建立类目录类的定义2023/9/25机械工业出版社Page632.MATLAB类的定义两个步骤:建立类目录类的定义2023/9/25机械工业出版社Page64建立类目录:路径文件夹

@文件夹2.MATLAB类的定义2023/9/25机械工业出版社Page65类的定义:类定义关键词classdef语法形式如下:classdefClassName...end当该类为一个继承类时,需要在定义类时指定它的父类,其语法形式如下:

classdefclassname<superclassname有多个父类的情况: classdefclassname<super1&super22.MATLAB类的定义2023/9/25机械工业出版社Page66类的定义:类属性语法形式如下:properties(SetAccess=protected) Coefficients=[001];end2.MATLAB类的定义2023/9/25机械工业出版社Page67类的定义:类方法classdefClassNamemethods(AttributeName=value,...)functionx=compute(obj,inc)%compute方法的定义x=obj.y+inc;end..

温馨提示

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

评论

0/150

提交评论