第五章MATLAB程序设计.ppt

上传人:李司机 文档编号:4102983 上传时间:2023-04-04 格式:PPT 页数:63 大小:374.50KB
返回 下载 相关 举报
第五章MATLAB程序设计.ppt_第1页
第1页 / 共63页
第五章MATLAB程序设计.ppt_第2页
第2页 / 共63页
第五章MATLAB程序设计.ppt_第3页
第3页 / 共63页
第五章MATLAB程序设计.ppt_第4页
第4页 / 共63页
第五章MATLAB程序设计.ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《第五章MATLAB程序设计.ppt》由会员分享,可在线阅读,更多相关《第五章MATLAB程序设计.ppt(63页珍藏版)》请在三一办公上搜索。

1、第五章 MATLAB程序设计,5.1 M文件介绍5.2 程序控制结构及语句5.3 变量作用域5.4 文件操作5.5 面向对象的程序设计5.6 程序设计辅助函数5.7 Matlab编译5.8 程序调试5.9 程序设计优化5.10 应用程序接口,5.1 M文件介绍,Matlab的文件类型一般可以分为两种,分别为.mat文件和.m文件。.mat数据文件是matlab以标准二进制格式保存的数据文件,可将工作空间中有用的数据变量保存下来,其生成和调用是由函数save和load完成的。.m文件起因于用户灵活使用Matlab,充分使用Matlab的科技资源;另外,命令行方式程序可读性差,对于复杂的问题,需要

2、编写成易存储的程序文件,由此产生了.m文件。其编辑可以使用多种编辑器,通常可以把.m文件简称为M文件。,5.1.1 M文件的创建与编辑,1.建立新的M文件(1)菜单操作:MATLAB命令窗口的File菜单 New菜单项 M-file命令。(2)命令操作:在MATLAB命令窗口输入命令edit。(3)命令按钮操作:单击MATLAB命令窗口工具栏上的“新建”命令按钮(4)使用DOS状态的edit编辑器编辑(5)使用windows系统的notbook/记事本进行创建(6)使用word进行创建,2.M文件的编辑在使用上述方式创建好M文件后可以通过上面的各类编辑器进行编辑,之后将M文件进行保存。文件保存

3、的目录一般默认为用户当前设置的工作目录注意:所创建编辑的m文件必须纳入matlab搜索路 径后,才能在matlab命令窗口运行。,5.1.2 M文件的分类,m文件的语法类似于c语言,但又有其自身特点。它只是一个简单的ASCII码文本文件,执行程序时逐行解释运行程序,matlab是解释性的编程语言。m文件有两类独立的m文件 称命令文件 可调用m文件 称函数文件(1).命令文件 简单的m文件 命令文件实际上是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一样的。没有输入输出参数。,命令式M 文件在运行过程中可以调用MATLAB 工作域内所有的数据,而且,所产生的所有变量均为全局变量

4、,直到用户执行clear命令清除。另外需注意的是:标点符号要运用恰当;注意程序的书写风格,保持程序的可读性;,(2).matlab内置函数文件 matlab自定义的函数文件称内置函数文件 调用内置函数的方法:使用函数名并给出相应的入口、出口参数即可。例如:sin.m函数用type sin查不到。调用格式:y=sin(2*x)实际应用中:x=0:2*pi/180:2*pi;y=sin(2*x)plot(x,y)又如 sqrt(x)求x的平方根 abs(x)求x的绝对值 det(a)求行列式的值 等等。matlab拥有大量的内置数学函数,供我们在数值 运算和符号运算中调用。,(3).函数m文件 需

5、要输入变量,返回输出变量 matlab用户可以根据需要编辑自己的m文件,它们可以像库函数一样方便的调用,从而极大地扩展了matlab 的能力。对于某一类特殊问题,如创建了许多m函数文件,则可形成新的工具箱。这种用matlab语言创建定义新的matlab函数的功能,正体现了matlab语言强大的扩展功能。,函数m文件的格式:function 返回变量=函数名(输入变量)注释说明语句段 程序语句段特定规则:函数m文件第一行必须以单词function作为引导词,必 须遵循如下形式:function=()m文件的文件名必须是.m。程序中的变量均为局部变量,不保存在工作空间中。其变量只在函数运行期间有效

6、。函数被调用时按 函数名(输入变量)格式执行函数执行完后,只保留返回结果,不保留中间过程,例如:function CustomVar01=SimpleFunction(a,b)%SimpleFunction用于显示两个数进行四则运算后的结果%使用help语句时应该能将此句注释显示出来,而使用%lookfor语句时应不能显示c=a+b;%对参数a,b进行加运算d=a-b;%对参数a,b进行减运算e=a*b;%对参数a,b进行乘运算f=a/(b+eps);%对参数a,b进行除运算CustomVar01=c,d,e,f;%将四项基本运算的结果放到一向量中去并显示;调用此函数,则有SimpleFunc

7、tion(2,3)ans=5.0000-1.0000 6.0000 0.6667,使用help语句获得帮助help SimpleFunction SimpleFunction用于显示两个数进行四则运算后的结果 使用help语句时应该能将此句注释显示出来,而使用 lookfor语句时应不能显示使用lookfor语句查询关键字lookfor 四则运算SimpleFunction.m:%SimpleFunction用于显示两个数进行四则运算后的结果注:为了利用MATLAB的关键字搜索功能,应该在M文件的第一行注释中,尽可能多的包含函数的特征信息。,(4).系统文件s函数 用于描述系统运动的专用函数,

8、是特殊的 m 文件。s 函数有3类:由simulink结构图自动创建 可用c语言程序设计mex文件直接定义 用函数m文件编写 s函数一旦创建,即可在框图中使用,也可在文件中调用。s函数的调用格式 sys,x0=sfunction(t,x,u,flag)其中 sys 系统状态 x0 状态初值 sfunction 用户定义的系统 t 当前时刻 x 当前状态值 u 当前输入值 flag 标志量s函数与函数m文件类似,只是输入输出变量是限定的。,例5.1.2-1 建立一个命令文件将变量a,b的值互换,然后运行该命令文件。首先建立命令文件并以文件名exch.m存盘:clear;a=1:10;b=11,1

9、2,13,14;15,16,17,18;c=a;a=b;b=c;a b 然后在MATLAB的命令窗口中输入exch,将会执行该命令文件。,例5.1.2-2 建立一个函数文件将变量a,b的值互换,然后在命令窗口调用该函数文件。首先建立函数文件fexch.m:function a,b=fexch(a,b)c=a;a=b;b=c;然后在MATLAB的命令窗口调用该函数文件:clear;x=1:10;y=11,12,13,14;15,16,17,18;x,y=fexch(x,y),5.2 程序控制结构及语句,matlab语言的程序结构与其它高级语言是一致的,分为顺序结构,分支结构,循环结构。(1).顺

10、序结构 依次顺序执行程序的各条语句(2).分支结构 根据一定条件来执行的各条语句。有些资料中也称其 为选择结构,主要是因为其语句往往是一些选择 判断性的语句。(3).循环结构 被重复执行的一组语句,循环是计 算机解决问题的主要手段。,5.2.1 常见程序控制流语句,input函数 调用格式为:A=input(提示信息,选项);其中提示信息为一个字符串,用于提示用户输入什么样的数据。如果在input函数调用时采用s选项,则允许用户输入一个字符串。例如,想输入一个人的姓名,可采用命令:xm=input(Whats your name?nHow are you?nHow old are you?,s

11、),disp函数 调用格式为 disp(输出项)其中输出项既可以为字符串,也可以为矩阵。注意:用disp函数显示矩阵时将不显示矩阵的名字,而且其格式更紧密,且不留任何没有意义的空行。,例5.2.1-1 求一元二次方程ax2+bx+c=0的根。程序如下:a=input(a=?);b=input(b=?);c=input(c=?);d=b*b-4*a*c;e=sqrt(d);x=(-b+e)/(2*a),(-b-e)/(2*a);disp(x1=,num2str(x(1),x2=,num2str(x(2);,pause函数 其调用格式为:pause(延迟秒数)如果省略延迟时间,直接使用pause,

12、则将暂停程序,直到用户按任一键后程序继续执行。若要强行中止程序的运行可使用Ctrl+C命令。pause暂停程序,等待回应;pause(n)等待n秒后继续执行;pause on 显示并执行pause命令;pause off 显示但不执行pause命令,keyboard 与input类似,功能更强 keyboard 调用键盘与调用m文件一样,当keyboard在m文件中出现时,它停止文件的执行并控制键盘,用于修改程序,重新返回原m文件时使用return语句。break 中断 break 中断for,while循环语句的执行,在嵌套循环结构中,break进从最里层循环推出。menu 产生一个拥护可选

13、择输入的菜单 格式:k=menu(标题,菜单1,菜单2,菜单3),echo 指令 用来控制m文件在执行过程中是否显示 echo on 打开所有命令文件的显示方式 echo off 关闭所有命令文件的显示方式 echo 在以上两者间切换 echo对于命令文件函数文件有所不同,命令文件用法简单,函数对所有命令起作用;函数文件用法较复杂,具体请help查询。echo file on 打开file函数文件的显示方式 echo file off 关闭file函数文件的显示方式 echo file 切换file函数文件的显示方式 echo on all 打开所有函数文件的显示方式 echo off all

14、 关闭所有函数文件的显示方式,5.2.2 分支结构,5.2.2.1 if语句 在MATLAB中,if语句有3种格式。1.单分支if语句 语句格式为:if 条件 语句组 end 当条件成立时,则执行语句组,执行完之后继续执行if语句的后继语句,若条件不成立,则直接执行if语句的后继语句。,2.双分支if语句 语句格式为:if 条件 语句组1 else 语句组2 end 当条件成立时,执行语句组1,否则执行语句组2,语句组1或语句组2执行后,再执行if语句的后继语句。,条件语句组,语句组1,语句组2,是,否,例5.2.2.1-1 计算分段函数值。程序如下:x=input(请输入x的值:);if x

15、=10 y=cos(x+1)+sqrt(x*x+1);else y=x*sqrt(x+sqrt(x);end y,3.多分支if语句语句格式为:if 条件1 语句组1 elseif 条件2 语句组2 elseif 条件n 语句组n else 语句组n+1end,条件1,语句组1,条件2,是,语句组2,是,否,条件n,语句组n,语句组n+1,否,否,是,例5.2.2.1-2输入一个字符,若为大写字母,则输出其后继字符,若为小写字母,则输出其前导字符,若为数字字符则输出其对应的数值,若为其他字符则原样输出。程序如下:c=input(请输入一个字符,s);if c=A end,5.2.2.2 swi

16、tch语句 其语句格式为:switch 表达式 case 表达式1 语句组1 case 表达式2 语句组2 case 表达式m 语句组m otherwise 语句组m+1 end,注意:无需像C语言那样在下一个case语句前加break语句;当需要在开关表达式满足若干个表达式之一时,用单元结构来表示;otherwise等价于C语言的default语句;程序的执行结果与case语句的次序无关。,例5.2.2.2-1 某商场对顾客所购买的商品实行打折销售,已知打折标准,求所售商品的实际销售价格。程序如下:price=input(请输入商品价格);switch fix(price/100)case

17、0,1 rate=0;case 2,3,4 rate=3/100;case num2cell(5:9)rate=5/100;case num2cell(10:24)rate=8/100;case num2cell(25:49)rate=10/100;otherwise rate=14/100;end price=price*(1-rate),5.2.2.3 try语句语句格式为:try 语句组1catch 语句组2end try语句先试探性执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2。这种试探性执行语句是其他高级语言所没有的。,例

18、5.2.2.3-1 矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。程序如下:A=1,2,3;4,5,6;B=7,8,9;10,11,12;try C=A*B;catch C=A.*B;endClasterr%显示出错原因,5.2.3 循环结构,5.2.3.1 for语句语句格式为:for 循环变量=表达式1:表达式2:表达式3 循环体语句 end 首先计算三个表达式的值,再将表达式1的值赋给循环变量,如果此时循环变量的值介于表达式1和表达式3的值之间,则执行循环体语句,否则结束循环的执行。执行完一次循环之后,循环变量自增一个表达式2的值,然后

19、再判断循环变量的值是否介于表达式1和表达式3之间,如果满足仍然执行循环体,直至不满足为止。这时将结束for语句的执行,而继续执行for语句后面的语句。,注意:for 语句一定要有end结束标志;循环语句中要用“;”防止中间结果的输出;书写时采用锯齿结构以增加可读性;例5.2.3.1-1 已知y的表达式,当n=100时,求y的值。程序如下:y=0;n=100;for i=1:n y=y+1/i/i;end y 在实际MATLAB编程中,为提高程序的执行速度,常用向量运算来代替循环操作:n=100;i=1:n;f=1./i.2;y=sum(f),注意:for 语句一定要有end结束标志;循环语句中

20、要用“;”防止中间结果的输出;书写时采用锯齿结构以增加可读性;,例5.2.3.1-1 已知y的表达式,程序如下:y=0;n=100;for i=1:n y=y+1/i/i;end y,当n=100时,求y的值。,例5.2.3.1-2 求定积分,程序如下:a=0;b=3*pi;n=1000;h=(b-a)/n;x=a:h:b;f=exp(-0.5*x).*sin(x+pi/6);for i=1:n s(i)=(f(i)+f(i+1)*h/2;end s=sum(s)事实上,MATLAB提供了有关数值积分的标准函数,实际应用中可直接调用这些函数求数值积分。,for语句更一般的格式:for 循环变量

21、=矩阵表达式 循环体语句 end 执行过程是依次将矩阵的各整列元素赋给循环变量,然后执行循环体语句,直至各列元素处理完毕。实际上,“表达式1:表达式2:表达式3”是一个仅为一行的矩阵(行向量),因而列向量是单个数据。,例5.2.3.1-3 已知5个学生4门功课的成绩,求每名学生的总成绩。程序如下:s=0;a=65,76,56,78;98,83,74,85;76,67,78,79;98,58,42,73;67,89,76,87;for k=a s=s+k;enddisp(s);,5.2.3.2 while语句 while语句的一般格式为:while(条件)循环体语句 end 其执行过程为:若条件

22、成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。,条件为真?,循环体语句,是,否,结束循环,y=0;i=1;while 1 f=1/i/i;y=y+f;if i=100 break;end i=i+1;end y与循环结构相关的有一个break语句,当在循环体内执行到该语句时,程序将跳出循环。该语句一般与if语句配合使用。,例5.2.3.2-1 已知y的表达式,当n=100时,求y的值。,5.2.3.3 循环的嵌套 如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。可以按照嵌套层数,分别叫做二重循环、三重循环等。处于内部的循环叫作内循环,

23、处于外部的循环叫作外循环。在设计多重循环时,要特别注意内、外循环之间的关系,以及各语句放置的位置,不要搞错。,例5.2.3.3-1 用筛选法求某自然数范围内的全部素数。程序如下:m=input(m=);p=2:m;for i=2:sqrt(m)n=find(rem(p,i)=0 end p,5.3 变量作用域,函数内部定义的变量均为局部变量,如果需要使用全局变量,则应当使用命令global定义,并且在任何使用该全局变量的函数中都应加以定义。定义全局变量时,变量之间必须用空格分隔,不能以逗号分隔。,例5.3-1先建立函数文件wadd.m,该函数将输入的参数加权相加。function f=wadd

24、(x,y)global ALPHA BETA f=ALPHA*x+BETA*y;在命令窗口中输入:global ALPHA BETA ALPHA=1;BETA=2;s=wadd(3,4),5.4 文件操作,5.4.1 文件的打开与关闭 1.打开文件 fopen函数的调用格式为:文件句柄=fopen(文件名,打开方式)如果句柄的值大于0,说明文件打开成功;打开方式:r 只读w 只写a 追加r+可读又可写,2.关闭文件 调用格式为:fclose(文件句柄)成功,则返回0;否则返回1。如果想关闭matlab运行中打开的所有文件,可以用fclose(all)命令。,5.4.2 二进制文件读写操作 1.

25、读二进制文件 fread 函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:A,COUNT=fread(Fid,size,precision)2.写二进制文件 fwrite 函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:COUNT=fwrite(Fid,A,precision),5.4.3 文本文件读写操作 1.读文本文件 fscanf 函数可以读取文本文件的内容,并按指定格式存入矩阵。其调用格式为:A,COUNT=fscanf(Fid,format,size)2.写文本文件 fprintf 函数可以将数据按指定格式写入到文本文件中。其调用格式为:COUNT=fp

26、rintf(Fid,format,A),5.4.4 数据文件定位 fseek函数用于定位文件位置指针,其调用格式为:status=fseek(Fid,offset,origin)ftell函数返回文件指针的当前位置,其调用格式为:position=ftell(Fid),例5.4-1 分析下列程序执行后,four、position和three三个变量的值。a=1:5;Fid=fopen(fdat.bin,w);%以写方式打开文件fdat.binfwrite(Fid,a,int16);%将a的元素以双字节整型写入文件fdat.binstatus=fclose(Fid);Fid=fopen(fdat

27、.bin,r);%以读数据方式打开文件fdat.binstatus=fseek(Fid,6,bof);%将文件指针从开始位置向尾部移动6个字节four=fread(Fid,1,int16);%读取第4个数据,并移动指针到下一个数据position=ftell(Fid);%ftell的返回值为8 status=fseek(Fid,-4,cof);%将文件指针从当前位置往前移动4个字节three=fread(Fid,1,int16);%读取第3个数据status=fclose(Fid);,5.5 面向对象程序设计,类和对象的构造 类的概念是结构体的拓展,类中可以包含变量形成员,也可以包含与这些变量

28、相关联的函数或运算。对象是类的一个实例。首先定义一个适当的名字;以这个名字建立一个子目录,目录名为该名称前加符号;编写一个引导函数,函数名与类同名。,例5.5-1:定义一个多项式类如果不给出输入变量,则建立一个空多项式;如果输入变量a为多项式类,则直接把它传送给输出变量p;如果a为向量,则将此向量变换成行向量,再构造一个多项式对象;function p=polynom(a)if nargin=0 p.c=;p=class(p,polynom);elseif isa(a,polynom),p=a;else p.c=a(:).;p=class(p,polynom);end,类的显示 在此目录下重新

29、建立display()函数。函数自动按照多项式显示的格式构造字符串,并显示出来。各种运算的建立 加法运算:对plus()函数进行重载定义;减法运算:对minus()函数进行重载定义;乘法运算:对mtimes()函数进行重载定义;乘方运算:对mpower()函数进行重载定义;,5.6 程序设计辅助函数,容错函数 error(错误信息)触发函数error时,中断程序的运行,显示错误信息。warning用法类似,但不会中断程序。,时间控制函数 日期表达形式:dd-mmm-yyyy mm/dd/yy mm/dd 12-Oct-2003 10/12/03 10/12 时间表达形式:HH:MM:SS HH

30、:MM:SS PM cputime的调用:t=cputime;程序段;t=cputime-t;显示该程序段运行所占用的CPU时间。,tic、toc的调用方法 tic;程序段;toc;显示运行该程序段所需的时间。etime(time2,time1)计算两时刻的时间差。,5.7 MATLAB编译,matlab编译的原因:1.提高运算速度2.隐藏特定算法3.可产生独立的m文件matlab编译函数:mccMCC-options fun fun2.mexfile1.mlibfile1.,5.8 程序调试,语法错误 发生在程序代码的解释过程中,一般有函数参数输入类型有误或矩阵运算阶数不符等情况。比如:A=

31、1:9;B=2:10;C=A*B?Error using=*Inner matrix dimensions must agree.执行错误 发生在程序运行过程中,出现溢出或死循环等引起,错误与程序有关,较难发现。a=1;while(a=1)a=1end,错误检测语法错误会给出相应的信息,容易检查定位;将程序执行的中间结果输出到命令窗口,以方便检查;使用keyboard函数中断程序,进入调试状态,实现交互式调试;将函数头注释掉,从而函数变为脚本文件调试;使用调试菜单或调试函数。,调试函数dbstop in M文件名 at 行号 用来在M文件中设置断点;函数dbstatus用来显示断点信息;函数d

32、btype显示M文件文本(包括行号);函数dbstep从断点处继续执行M文件;函数dbstack显示M文件执行时调用的堆栈等;函数dbup/dbdown可以实现工作空间的切换;,5.9 程序设计优化,以矩阵为操作主体 以向量运算代替循环运算,提倡矩阵操作tic;x=0;for i=1:100001 y(i)=sin(x);x=x+0.01*pi;endtoc;elapsed_time=0.0620,tic;x=0:0.01*pi:1000*pi;y=sin(x);toc;elapsed_time=0.0470,在多重循环的情况下,建议外循环执行循环次数少的,内循环执行循环次数多的。tic;fo

33、r i=1:10000 for j=1:10 A(i,j)=1;endendtoc;elapsed_time=0.0160,tic;for i=1:10 for j=1:10000 A(j,i)=1;endendtoc;elapsed_time=0.0150,大型矩阵预先定维 大型矩阵动态的定维会降低程序运行效率,所以,应预先估计变量的最大维数,用zeros或ones等进行预先定维。优先考虑内在函数采用有效算法采用Mex技术,5.10 应用程序接口,应用程序接口是matlab的附加组件。是一个由相关函数组成的接口函数库,可实现与外部程序的交互。MEX文件:是matlab环境下调用C、FORTRAN 语言编写的应用程序模块。matlab 计算引擎:在使用C、FORTRAN编程时 可调用matlab函数库进行计算。MAT文件:实现matlab与C、FORTRAN语言程序间的 数据交换,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号