版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 M文件与程序设计复杂冋题的解算需要借助 MATLAB程序进行。这种程序的扩展名为 m 故称为 M文件。M文件分为(M )脚本文件和(M )函数文件。本章介绍编写MATLAB程序时常用的控制结构、函数文件 的构造、主函数、子函数及述函数句柄的创建、观察和调用。6.1MATLAB控制流6.1.1语法说明if表达式语句体1 elseif语句体2 else语句体3 end若表达式返回数组,则仅当所 有元素都不为零时为真;若数组为 空,则为假。elseif和 else可选,其中可有多 个 elseifoswitch表达式 case表达式1语句体1 case式2,式3语句体2 otherwise语句体3
2、end仅执行第一个满足条件的语句 体。case后可用化括号把多个表达 式以或”逻辑连接起来。可有多个case语句。otherwise可选。for x =表达式语句体end执行确定次数的循环。表达式为矩阵时,x把矩阵按 列拉长为向量取值。while表达式语句体end右表达式为真时,循环执仃语句 体。if-else-end控制结构if-else-end指令为程序流提供了一种分支控制。单分支双分支多分支if expr (commands) endif expr (commands) else (commands2) endif expr1 (commands) elseif expr2 (comma
3、nds)else (commandsk) end当expr给出“逻辑1”时, (commands) 指令组才被 执行。当expr给出“逻 辑1 ”时,(commands)指 令组被执行;否 贝打(commands2) 被执行。expr1, expr2,中,首 先给出“逻辑1”的那个 分支的指令组被执行;否 贝打(commandsk)被执行。该使用方法常被 switch-case所 取代。表6.1-1 if-else-end分支结构的使用方式x芝I x!3 xI x+1e【例6.1-1】已知函数y编写能对任意一组输入 x值求相应y值的程序。编写函数文件程序:function y=exm06010
4、1(x)% y=exm060101(x) Function calculate of exa mple 6.1-1 n=length(x);for k=1:nif x(k)=1 y(k)=ex p(1-x(k); else y(k)=x(k)A3;endend保存在搜索路径上调用函数文件x=-2,-12-0.4,0.8,1,6 y=exm060101(x)6.1.2switch-case空制结构表6.1-2 switch-case空制结构的使用方式指令格式switch exprcase value 1expr为根据此前给定变量进行计算的表 达式(commands) case value 2(c
5、ommands2) case value k(commandsk)otherwise(commands) endvalue_1是给定的数值、字符串标量(或 单元数组)若expr结果与value_1 (或其中的单元元素)相等,则执行。value_k是给定的数值、字符串标量(或 单元数组)若expr结果与value_k (或其中的单元元素)相等,则执行。该情况是以上的“并”的“补”若所有case都不发生,则执行该组命令。【例6.1-2】已知学生的名字和百分制分数。要求根据学生的百 分制分数,分别采用“满分”、“优秀”、“良好”、“及格” 和“不及格”等表示学生的学习成绩。clear;for k=1
6、:10a(k)=89+k;b(k)=79+k;c(k)=69+k;d(k)=59+k;end;c=d,c;%A=cell(3,5);A(1,:)=Jack,Marry, Peter,Rose,Tom;A(2,:)=72,83,56,94,100;%for k=1:5switch A2,kcase 100r=满分;case ar=优秀:case br=良好;case cr=及格;otherwiser=不及格;end6.1.3A(3,k)=r; end Afor循环while循环for ix=arraywhile exp ression(commands)(commands)endendfor循环
7、和while循环表6.1-3循环结构的使用方式【例6.1-3】创建Hilbert矩阵。(1) Hilbert 矩阵 a(i,j)=。i + J T(2)K=5;A = zeros(K,K); for m = 1:Kfor n = 1:KA(m, n) = 1/(m+n -1); endend format ratA%format short gA =Columns 1 through 411/21/31/41/21/31/41/51/31/41/51/61/41/51/61/71/51/61/71/8Column 51/51/61/71/81/9(3)clearticK=1000;for m
8、= 1:Kfor n = 1:KA1(m,n) = 1/(m+n -1); end end t1=toc ticK=1000;A2 = zeros(K,K);for m = 1:Kfor n = 1:KA2(m,n) = 1/(m+n -1)endendt2=toc(4)ticN=1000; n=repmat(1:N,N,1);m=n;A3=1./(n+m-1);t3=tocclearticN=5; n=repmat(1:N,N,1); m=n;A3=1./(n+m-1)t3=tocformat ratA3A3 =10.50.333330.250.20.50.333330.250.20.166
9、670.333330.250.20.166670.142860.250.20.166670.142860.1250.20.166670.142860.1250.111110.66052t3 =11/21/31/41/21/31/41/51/31/41/51/61/41/51/61/71/51/61/71/8A3 =Columns 1 through 4Column 51/51/61/71/81/9【例 6.1-5】 偶数。% exm060105.m为能被 4整除的偶数。% A为魔方矩阵% n魔方矩阵的阶数clear clc while 1n=i np ut(请输入一个能被 4整除的正整数!n
10、=);if mod(n,4)=0breakend end G=logical(eye(4,4)+rot90(eye(4,4); m=n/4;K=repmat(G,m,m);N=n2;创建n阶魔方矩阵,限定条件是n为能被4整除的生成一类魔方矩阵,该魔方矩阵的阶 nA=resha pe(1:N,n,n); A(K)=N-A(K)+1验证所生成的魔方阵正确与否的程序: sO=rou nd( n*( n*n+1)/2);dis p(i nt2str( n), ,i nt2str(s0) Ns0=rou nd(2*( n+1); B=A; SC=sum(A); SR=sum(B); Sd=sum(dia
11、g(A); Sdi=sum(diag(B); LS=SC,SR,Sd,Sdi=s0; NS=rou nd(sum(LS); if NS=Ns0dis p( elsedis p( end阶魔方矩阵的标称和是经验证,A是魔方矩阵。)经验证,A不是魔方矩阵。)指令格式使用说明v=inpu t(message) v=inpu t(message,s)该指令执行时,“控制权”交给键盘;待输 入结束,按下 Enter键,“控制权”交还 MATLAB。message是提示用的字符串。keyboard遇到keyboard时,将“控制权”交给键盘, 用户可以从键盘输入各种 MATLAB指令。breakbreak
12、指令,或导致包含该指令的 while、for 循环终止,或在 if - end, switch - case, tr catch中导致中断。参见例 6.1-5。continue跳过位于它之后的循环体中其他指令,而执 行循环的下一个迭代.见例6.1-5。p ause p ause(n)第一种格式使程序暂停执行,等待用户按任 意键继续;第二种格式使程序暂停n秒后,再继续执行。return结束return指令所在函数的执行,而把控制控制程序流的其它常用指令表6.1-4控制程序流的其它常用指令6.1.4转至主调函数或者指令窗。否则,只有待整 个被调函数执行完后,才会转出。try语句体1 catch语句
13、体2 end语句体1总被执行,若没有错误则跳出 try/catch 块。若语句体1执行过程中发生错误,则执 行语句体2。可以嵌套使用。利用try-catch模块,MATLAB编译系统发 现的错误将被用户捕获,用户可以控制MATLAB怎样对发生的错误进行处理。error(e1:%s bad,svar)显示错误信息并退出程序。warning显示警告信息但不退出程序。dbst op if all error如遇错误/警告,则停止执行并进入调试状 态6.2脚本文件和函数文件 注意:用户自己创建的 M文件的文件名要避免与 MATLAB 的内建函 数和工具箱中的函数重名,以免发生内置函数被替换的情况。6.
14、2.1 M脚本文件对于一些比较简单的问题,从指令窗中直接输入指令进行计算是十分轻松简 单的事。但随指令数的增加,或随控制流复杂度的增加,或重复计算要求的提 出,直接从指令窗进行计算就显得烦琐。而此时脚本文件最为适宜。“脚本”本身反映这样一个事实:MATLAB只是按文件所写的指令执行。MATLAB指令集合。 MATLAB基本 只要用户不使用clear指令加以清除,这些变量脚本文件的特点是: 它只是一串按用户意图排列而成的 脚本文件运行后,产生的所有变量都驻留在 工作空间中。将一直保存在基本工作空间但ase works pace中。基本空间随 MATLAB的启动而产生;只有当关闭 MATLAB 时
15、,该基本空间才被删除。6.2.2 M函数文件函数文件犹如一个“黑箱”。从外界只看到:传给它的输入量和送出来的计算结果。而内部运作是藏而不见的。函数文件的特点是:从形式上看,与脚本文件不同,函数文件的第一行总是以function引导的“函数申明行”。该行还罗列出函数与外界的联系的全部“标称”输入输出宗量。但对“输入输出宗量”的 标称数目并没有限制,即可以完全没有输入输出宗量,也可以 是任意数目。MATLAB 允许使用比“标称数目”较少的输入输出宗量, 实现对函数的调用。在一次调用中所用到的输入和输出变量的 个数可以通过分别调用函数 nargin 和 nargout 来确定。因为 nargin 和
16、 nargout 是函数而不是变量,所以用户不能用诸如 nargin=nargin+pi 之类的语句对它们进行重新赋值。从运行上看,与脚本文件运行不同,每当函数文件运行, MATLAB 就会专门为它开辟一个临时工作空间,称之谓 函数工 作空间(Function works pace)。所有中间变量都存放在函数工作 空间中。当执行完文件最后一条指令或遇到 return 时,就结束 该函数文件的运行,同时该临时函数空间及其所有的中间变量 就立即被清除。函数空间随具体 M 函数文件的被调用而产生,随调用结 束而删除。函数空间是相对基本空间独立的、临时的。在 MATLAB 整个运行期间,可以产生任意多
17、个临时函数空间。假如在函数文件中, 发生对某脚本文件的调用, 那么该脚 本文件运行产生的所有变量都存放于该函数空间之中,而不是 存放在基本空间。6.2.3 局部变量和全局变量局部(Local)变量中间变量被称为局部变量。存在于函数空间内部的中间变量,产生于该函数的运行过程 中,其影响范围也仅限于该函数本身。正由于这种空间、时间 上的局部性,全局(Global)变量通过 global 指令, MATLAB 也允许几个不同的函数空间以 及基本工作空间共享同一个变量。这种被共享的变量称为全局 变量。每个希望共享全局变量的函数或 MATLAB 基本工作空间, 必须逐个用global对具体变量加以专门定
18、义。没采用 global定 义的函数或基本工作空间,将无权享用全局变量。如果某个函数的运作使全局变量的内容发生了变化,那么其他函数空间以及基本工作空间中的同名变量也就随之变化。除非与全局变量联系的所有工作空间都被删除,否则全局变 量依然存在。说明对全局变量的定义必须在该变量被使用之前进行。建议把全局变量的定义放 在函数体的首行位置。虽然MATLAB对全局变量的名字没有任何特别的限制,但是为了提高M文件的可读性,建议选用大写字符命名全局变量。全局变量损害函数的封装性,因此不提倡使用全局变量。基本组成部分函数示例函数头,定义函数名和输入输出参 数(仅用于函数文件)function f=fact(n
19、)help帮助:指M文件最前面连续的注 释行,注意空行前也要有注 释符。命令 helP fact可显 示这些信息;H1行指M文 件的第一行注释,用于 ookfor快速查找。H1行% FACT Factorial.% FACT(N) returns N!% FACT(N) is equal to P R0D(1:N).% Exa mples% f=fact(5)% See also P ROD这个不带%的空行表示 he Ip帮 助结束普通注释% Author: WHM文件的一般结构(看 PPT课件)6.2.4%$Version:1.0$ $Date:20036$语句体检查输入输出参数,仅用 于函
20、数文件(也可以没有)if nargin=1 |isnumeric(n) |.all(size(n)= 1 1)error(Input must be a. integer.)end功能语句f=p rod(1:n);从结构上看,脚本文件只是比函数文件少一个 “函数申明行”。 典型M函数文件的结构如下:函数申明行:位于函数文件的首行,以 function开头,函数名以及函数的输 入输出宗量都在这一行定义。H1 行:它是紧随函数申明行之后以开头的第一注释行。H1行包含:大写体的函数文件名;运用关键词简要描述的函数功能。 该H1行供lookfor关键词查询和help在线帮助使用。在线帮助文本(HelP
21、 text)区:H1行及其之后的连续以开头的所有注释行构成整个在线帮助 文本。它通常包括:函数输入输出宗量的含义,调用格式说明。编写和修改记录:与在线帮助文本区相隔一个“空”行,也以开头,标志编 写及修改该M文件的作者和日期、版本记录。它用于软件档案 管理。函数体(Function body):为清晰起见,它与前面的注释以“空”行相隔。这部分内容 由实现该M函数文件功能的 MATLAB指令组成。它接收输入 宗量,进行程序流控制,得到输出宗量。若仅从运算角度看,惟有“函数申明行”和“函数体”两部 分是构成M函数文件所必不可少的。【例6.2-1】编写一个M函数文件。它具有以下功能:(A)根 据指定
22、的半径,画出蓝色圆周线;( B)可以通过输入字符串, 改变圆周线的颜色、线型;(C)如果需要输出圆面积,则绘出 圆。( 1) M 函数文件function S,L=exm060201(N,R,str)% exm060201.m The area and perimeter of a regular polygon (正多边形的面积和周长 )%N%R%strtype/color%S%L% exm060201% exm060201(N)形% exm060201(N,R)形% exm060201(N,R,str)正 N 边形% S=exm060201(.)边形填色图% S,L=exm060201(.
23、)应正多边形填色图The number of sidesThe circumradiusA line specification to determine lineThe area of the regular polygonThe perimeter of the regular polygon 用蓝实线画半径为 1 的圆 用蓝实线画外接半径为 1 的正 N 边用蓝实线画外接半径为 R 的正 N 边用 str 指定的线画外接半径为 R 的给出多边形面积 S ,并画相应正多给出多边形面积S和周长L,并画相switch nargincase0N=100;R=1;str= -b;case1R=1;
24、str= -b ;case2str=-b ;case3 ;otherwiseerror( 输入量太多。 ); end;t=0:2*pi/N:2*pi; x=R*sin(t);y=R*cos(t);if nargout=0 plot(x,y,str);elseif nargout2error( 输出量太多。 ); elseS=N*R*R*sin(2*pi/N)/2;L=2*N*R*sin(pi/N); fill(x,y,str)endaxis equal squarebox onshg (2)调用指令S,L=exm060201(6,2,-g)6.3 MATLAB 的函数类别中,函数 又被细分为:
25、主函数;子函数;嵌套在 MATLAB 函数;私用函数;匿名函数等。本节只对主函数、子函数及匿 名函数进行阐述。6.3.1主函数( Primary function )6.3.2子函数( Subfunction)【例 6.3-1】编写一个内含子函数的 M 函数绘图文件。( 1)M 函数文件function Hr=exm060301(flag )% exm060301.m Demo for handles of primary functions and subfunctions% flag 可以取字符串 line 或 circle 。% Hr 子函数 cirline 的句柄 t=(0:50)/5
26、0*2*pi;x=sin(t); y=cos(t); Hr=cirline; feval(Hr,flag,x,y,t) % subfunctionfunction cirline(wd,x,y,t) % cirline(wd,x,y,t) % % % %wd t x y是位于 exm060301.m 函数体内的子函数 接受字符串 line 或 circle 画线用的独立参变量 由 t 产生的横坐标变量 由 t 产生的纵坐标变量switch wd caselineplot(t, x, b ,t , y, r , LineWidth , 2) casecircleplot(x, y, -g, Li
27、neWidth , 8), axis square off otherwiseerror( 输入宗量只能取 line 或 circle ! ) end shg( 2) 在命令窗调用该函数的命令 HH=exm060301(circle)( 3)直接利用创建的子函数句柄调用该主函数的子函数 t=0:2*pi/5:2*pi;x=cos(t);y=sin(t);%为绘制正五边形准备数据利用句柄绘图HH(circle,x,y,t) %6.3.3* (根据学时选讲)匿名函数(Anonymous function)匿名函数提供了一种创建简单程序的方法, 使用它用户可以不必每次都编写M 文件。用户可以在 MA
28、TLAB 的命令窗口或是其他任意 M 文件和脚本文件中 使用匿名函数。1)创建匿名函数的一般方法: FH= (arglist) expr2)匿名函数的调用格式直接调用格式间接调用格式FH(arglist) feval(FH, arglist)匿名函数算例:10【例 4.1-6】求 s =xydxdy。syms x ys=v pa(i nt(i nt(x八y,x,0,1),y,1,2) s =.40546510810816438197801311546432 format longs_n=dblquad(x,y)x.八y,0,1,1,2)函数句柄(Function handle)是MATLAB 的一种数据类型。 它携带着“相应函数创建句柄时的路径、视野、函数名,以及 可能存在的重
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44903-2024温室气体产品碳足迹量化方法与要求畜产品
- 商铺合同模板集合
- 二零二四年度高速公路声屏障施工合同3篇
- 空白劳动合同范本2篇
- 2024年度电力工程质量问题处理与维修合同2篇
- 动物皮肤病课件
- 化工原理自测题:第二章(自)
- 2024年度企业改制与重组合同4篇
- 中医科推拿护理小讲课
- 员工创新管理分析报告
- FAB-常用词汇介绍
- 放射防护管理机构(组织构成、管理部门、人员、职责)
- 2023-2024年司考刑法真题(含答案及解析)
- 上肢血管超声检查
- pep人教版英语四年级上册 Unit 6《Meet my family!》单元作业设计
- 高寒地区陆上大型风力发电机组安装工法文本
- ISTA-6-AMAZON-亚马逊测试标准(快递包裹运输)
- 施工方案abcd类分类
- 职业病危害告知书
- 情绪管理学习通超星课后章节答案期末考试题库2023年
- 科教版高中信息技术必修1第一单元初识数据与计算1.2数据的计算公开课一等奖课件省赛课获奖课件
评论
0/150
提交评论