MATLAB程序设计与应用-第四章

更新时间:2023-06-06 19:17:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MATLAB程序设计与应用

第4章 MATLAB程序设计前言

MATLAB程序设计与应用环测学院赵银娣 2011~2012学年第2学期

MATLAB作为一种广泛应用的科学计算软件,不仅具有强大的数值计算、符号计算能力和丰富的作图功能,还可以像 FORTRAN、C等其他计算机高级语言一样进行控制流的程序设计,即编制一种以m为扩展名的文本文件,简称M文件,实现各种复杂的运算.MATLAB程序设计语言属于第四代编程语言,其编程方式相当简洁,编程效率比常用的Fortain、C、 C++等语言要高的多,如语言简单、可读性强、调试容易及调用方便等。

第4章 MATLAB程序设计前言程序设计展示:随机展示一下方向、大小、颜色各异的五角星。示例文件:RandDisplay5.m由于是随机显示,每次执行的结果稍有不同。本程序内容将在4.2节中作详细介绍。

第4章 MATLAB程序设计

第四章 MATLAB程序设计4.1 M文件介绍一、M文件的特点与形式二、M文件的创建三、M文件的类型

4.1 M文件介绍一、M文件的特点与形式MATLAB有两种工作方式: 1、指令驱动模式即在命令窗口中输入命令,MATLAB会立即执行并显示结果;但命令行操作时, MATLAB窗口只允许一次执行一行上的一个或几个语句。命令行方式程序可读性差,而且不能存储,对于复杂的问题,应编写成能存储的程序文件。

4.2程序的流程控制 4.3 M文件函数 4.4程序的调试与优化

MATLAB程序设计与应用

4.1 M文件介绍一、M文件的特点与形式2、m文件模式将Matlab语句构成的程序存储成以m为扩展名的文件,然后再执行该程序文件,这种工作模式称为程序文件模式。程序文件不能在指令窗口下建立,因为指令窗口只允许一次执行一行上的一个或几个语句。

4.1 M文件介绍二、M文件的创建1、在Matlab命令窗口点击 File -> New-> m-file 2、点击File -> Save File As将编辑器中的内容存入文件 *.m 3、编辑器——用系统自带的记事本或者word可以打开编辑m文件,也可以使用专业的编辑工具,例如:UltraEdit。当然更好的选择是用MATLAB自带的编辑器编写m文件。

4.1、M文件介绍二、M文件的创建

4.1、M文件介绍

MATLAB菜单中创建m文件

使用记事本创建m文件

MATLAB自带的m文件编辑器

4.1 M文件介绍二、M文件的创建注意:所创建的m文件必须纳入Matlab搜索路径后,才能在 Matlab命令窗口运行。 Matlab搜索路径的设置 1. path命令 2.用pathtool路径浏览器设定当前目录。可以在命令行输入pathtool,也可以在file—set path中加入文件夹或文件。

4.1 M文件介绍一、M文件的特点与形式二、M文件的创建三、M文件的类型1、命令文件—简单的m文件 2、Matlab内置函数文件 3、函数m文件—需要输入变量,返回输出变量 4、系统

文件——s函数

MATLAB程序设计与应用

三、M文件的类型1、命令文件—简单的m文件命令文件实际上是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一样的。命令文件的特点:命令文件没有输入输出参数。命令文件运行中可以调用工作空间的数据,运行中产生的所有变量为全局变量。命令文件可以直接运行。

三、M文件的类型1、命令文件—简单的m文件

三、M文件的类型1、命令文件—简单的m文件MATLAB自带的m文件编辑器中将不同的变量用不同的颜色显示,系统默认如下:关键字:蓝色注释:绿色

三、M文件的类型

字符串:红色…如果不喜欢,你可以在编辑器的File->Preferences… ->General->Font&Colors中更改它

三、M文件的类型1、命令文件—简单的m文件对m文件进行修改后,在文件名后面会有一个‘ *’号,表示还未保存,在未保存之前运行该文件,MATLAB执行的是未修改前的旧文件!

三、M文件的类型1、命令文件—简单的m文件如何有效加注释:%最常用的操作,但是效率慢。如果是对大段的代码进行注释,可使用下面三种方法:选中大段代码,鼠标右键—comment,如果要取消大段代码的注释,同样鼠标右键—uncomment快捷键:加注释是选中代码按 Ctrl+r,取消注释是选中代码按 Ctrl+t。

在调试程序时一定要注意这一点,修改之后先保存,再运行,不然出错的地方即使改对了,程序一运行仍然出错。

if(0)大段的代码 end

MATLAB程序设计与应用

4.1 M文件介绍一、M文件的特点与形式二、M文件的创建三、M文件的类型1、命令文件—简单的m文件 2、Matlab内置函数文件 3、函数m文件—需要输入变量,返回输出变量 4、系统文件——s函数

三、M文件的类型2、Matlab内置函数文件Matlab自定义的函数文件称内置函数文件调用内置函数的方法:使用函数名并给出相应的入口、出口参数即可。例如:sin.m函数——用type sin查不到。返回为:sin is a built-in function.实际应用中可以直接调用,例如: x=0:2*pi/180:2*pi; y=sin(2*x); plot(x,y)

4.1 M文件介绍一、M文件的特点与形式二、M文件的创建三、M文件的类型1、命令文件—简单的m文件 2、Matlab内置函数文件 3、函数m文件—需要输入变量,返回输出变量 4、系统文件——s函数

三、M文件的类型3、函数m文件—需要输入变量,返回输出变量Matlab用户可以根据需要编辑自己的m文件,它们可以像库函数一样方便的调用,从而极大地扩展了Matlab的能力。对于某一类特殊问题,如创建了许多m函数文件,则可形成新的工具箱。这种用Matlab语言创建定义新的Matlab函数的功能,正体现了Matlab语言强大的扩展功能。

三、M

文件的类型3、函数m文件—需要输入变量,返回输出变量函数m文件的格式: (1)函数定义行: function[返回变量、参数]=函数名(输入变量、参数) (2)函数说明,就是函数注释。 (3)函数体:程序语句段,完成函数的功能。特定规则:

三、M文件的类型3、函数m文件—需要输入变量,返回输出变量函数m文件第一行必须以单词function作为引导词,必须遵循如下形式: function[因变量]=函数名(自变量) m文件的文件名必须是<函数名> .m。程序中的变量均为局部变量,不保存在工作空间中,也不能调用工作空间的数据,其变量只在函数运行期间有效。不能直接运行,只能调用。因为系统无法确定输入变量。只能在当前目录运行。

MATLAB程序设计与应用

4.1 M文件介绍一、M文件的特点与形式二、M文件的创建三、M文件的类型1、命令文件—简单的m文件 2、Matlab内置函数文件 3、函数m文件—需要输入变量,返回输出变量 4、系统文件——s函数

三、M文件的类型4、系统文件——s函数用于描述系统运动的专用函数,是特殊的 m文件。 s函数有3类:(1)由simulink结构图自动创建 (2)可用c语言程序设计mex文件直接定义 (3)用函数m文件编写 s函数一旦创建,即可在框图中使用,也可在文件中调用。

三、M文件的类型S函数的调用格式示例:用户定义的系统当前输入值

第4章 MATLAB程序设计4.1 M文件介绍 4.2程序的流程控制MATLAB中除了按正常执行程序中的命令和函数以外,还提供了8种控制程序流程的语句,这些语句包括for、while标志量

[sys, x0]=sfunction( t, x, u, flag)系统状态状态初值当前时刻当前状态值

、switch、if、try、continue、break、return等等。

4.3 M文件函数 S函数与函数m文件类似,只是输入、输出变量是限定的。 4.4程序的调试与优化

第4章 MATLAB程序设计4.1 M文件介绍 4.2程序的流程控制一、循环语句二、条件语句三、分支语句四、检测语句五、其他语句

4.2程序的流程控制一、循环语句在实际问题中,会遇到许多有规律的重复运算,因此在程序设计中,需要将某些语句重复执行。一组被重复执行的语句称为循环体,每循环一次,都必须作出是否继续重复的决定,这个决定所依据的条件称为循环的终止条件。 MATLAB提供了两种循环方式,for-end循环和while-end循环。

4.3 M文件函数 4.4程序的调试与优化

MATLAB程序设计与应用

4.2程序的流程控制一、循环语句1、for循环 for循环为计数循环语句,在多数情况下,循环条件是有规律变化的,循环的次数是确定的,通常把循环条件的初值,差别和变化放大循环的开头, for循环的一般形式为: for i=begin:step:end语句体 end

4.2程序的流

程控制一、循环语句for i=begin:step:end语句体 end其中begin为循环初始值,end为循环终止值,step为步长,缺省值为1。 MATLAB的for循环各其他编程语言没有区别,for和end必须配对使用。

4.2程序的流程控制一、循环语句例:利用for循环求1+2+3+…+99+100的值sum=0; for i=1:100 sum=sum+i; end sumaxis off; for k= 1:40

4.2程序的流程控制例:RandDisplay5.m%隐去坐标轴%循环40次 set(gcf,'menubar','none','toolbar','none');%不显示当前figure菜单栏和工具栏%每次在(rand,rand)这个随机的位置,显示随机字体大小,%随机生成RGB颜色,并随机旋转一定角度来显示“★” text(rand,rand,'★','Fontsize',ceil(rand*100), ... 'Color',rand(1,3),'Rotation',360*rand) pause(0.2); end%每显示完一次暂停0.2秒

运行结果 sum= 5050

4.2程序的流程控制介绍几个函数:rand:产生0到1,不包括1的随机数,MATLAB刚运行时,种子都为初始值,因此每次第一次执行rand得到的随机数都是相同的。 ceil()朝正无穷方向舍入,舍入变得越大

4.2程序的流程控制一、循环语句答案:不能。因为rand函数有可能产生小于0.001的随机数 ceil(rand*100)永远大于等于1, floor(rand*100)和fix(rand*100)都有可能等于0,而‘Fontsize’属性要求字体大小必须大于0!这个问题很隐蔽,因为即使使用floor、fix后运行刚开始并不会出错,因为rand函数要运行很多次才可能产生小于0.001的随机数。所以,编程一定要细心,细心,再细心!这句话也有个下联:文件一定要备份,备分,再备份!

floor()朝负无穷方向舍入,舍入后变得越小 fix()朝零方向舍入,负数舍入后越大,正数舍入后越小

round()四舍五入流程控制语句象骨骼,函数就象血肉,两者互相配合才能写出好的程序,请同学们注意这些函数的学习!思考题:上例中ceil()换成其他函数如floor(),fix()等函数行不行?

MATLAB程序设计与应用

4.2程序的流程控制一、循环语句for循环可以嵌套,但是要注意的是,在嵌套中每一个for都必须与end相匹配,否则循环将出错。m=3; n=4; for i=1:m for j=1:n a(i,j)=1/(i+j-1); end end format rat a%用分数表示

4.2程序的流程控制一、循环语句2、while循环 while循环是条件循环语句, while循环使语句体在逻辑条件控制下重复不确定次,直到循环条件不成立为止。 while循环的一般形式为: while表达式语句体 end

4.2程序的流程控制一、循环语句只要表达式的结果非零,语句体就重复执行。当表达式结果不是标量时,可以使用any,all等函数处理。while和end必须配对使用。例:利用while循环,求解n!阶乘达到100位数的第一个n是多少? n=1; while prod(1:n)<1e100%1e100就是10的100次方,也就是数字1后面跟着100个零 n=n+1; end n% n=70

4.2程序的流程控制二、条件语句在复杂的运算中常常需要判断是否满足某些条件,以选择下一步的方法和策略。一战使用条件语句完成这类判断和选择。 1、if-end语句if-end语句是最简单的条件语句 if表达式语句体 end

4.2程序的流程控制二、条件语句关键字if后的表达式确定了判断条件,表达式必须首先计算,由于MATLAB中没有布尔量,所以以表达式的值是否为零作为判断标准。如果表达式值不为零,则执行if和end之间的所有语句,否则跳过if结构,执行end后面的语句。

4.2程序的流程控制二、条件语句2.if-else-end语句 if-else-end语句在if和end之间增加—个else选择,语句的一般形式为:if表达式语句体1; else语句体2; end当表达式的值为真时,执行语句体1,否则执行语句体2。

MATLAB程序设计与应用

4.2程序的流程控制二、条件语句例:exam4_2_5.mx=input('请输入一个小于5的正数');%等侍用户输入 if x>0& x<5 disp('输入正确。'); else disp('输入不正确!'); endend else例:exam4_2_5.m

二、条件语句%如果输入的数是一个小5的正数就接受,否则给出错误提示 x=input('请输入一个小于5的正整数'); y=floor(x); if x>y disp('出错了,不是整数!'); else if x<=0| x>=5 disp('出错了,超出范围!'); disp('输入正确!'); end%注意:有一个if就有一个end,这点与其他编程语言略有不同!%向下取整

%零既不是正数,也不是负数

4.2、程序的流程控制二、条件语句2.if-else-end语句三、分支语句

4.2程序的流程控制分支语句switch-case-end通过对某个表达式的值进行比较,以实现程序的分支功能,语句的一段形式为:switch表达式(数值或字符串) case数值或字符串1语句体1; case数值字或符串2语句体2;… otherwise语句体n; end

4.2程序的流程控制三、分支语句switch后面表达式的值为数值变量或字符变量,通过这些值与case后面的值进行比较,与哪一个case的值相同就执行哪一个case下面的语句体。如果与所有case的值都不相同,则执行otherwise下面的语句体。otherwise语句可以省略,如果省略otherwise,所有case都不满足时跳出分支结构, switch与end必须配对使用。

4.2程序的流程控制三、分支语句与c语言不同的是,c语言中对每个case都要比较,即使前面一个已经执行过,因此通常在case的语句体后面加一个 break语句,使程序只执行第一个满足条件的case。而 MATAB中只完成第一个满足条件的case,不再继续比较,因此不需要break语句。

MATLAB程序设计与应用

三、分支语句例: exam4_2_6.m%本程序用来判断1到10之间的数是奇数还是偶数。 x=input('请输入1到10之间的整数'); switch x case{1,3,5,7,9} disp('The value is odd.'); case{2,4,6,8,10} disp('The value i

s even.'); otherwise disp('The value is out of range.'); end

三、分支语句

4.2程序的流程控制四、检测语句检测语句try-catch主要用于检测错误并改变流程,其一般形式为:try语句体1 catch语句体1 end

4.2程序的流程控制四、检测语句n=4; a=magic(3);%设置3×3矩阵a try a_n=a(n,:)%取a的第n行元素 catch a_end=a(end,:) end lasterr

检测语句首先执行try下面的语句体1,如果没有错误,执行完成后跳出结构。如果执行语句体1时出现错误,则执行catch下面的语句体2。可以使用lasterr函数(error)查询最后的错误信息,当查询结果为空字符串时表示语句体1成功执行。

4.2、程序的流程控制四、检测语句

4.2程序的流程控制五、其他语句1.continue语句 continue语句用于在for循环和while循环中跳过某些执行语句。在for循环和while循环中,如果出现continue语句,则跳过循环体中所有剩余的语句,继续下一次循环,在嵌套循环中,continue控制执行本嵌套中的下一次循环。 2.break语句

MATLAB程序设计与应用

4.2程序的流程控制五、其他语句1.continue语句 2.break语句 break语句用于终止for循环和while循环的执行。如果遇到break语句,则退出循环体,执行循环体外的下—行语句。在嵌套循环中,break只存在于最内层的循环中。 3.return语句

4.2程序的流程控制五、其他语句1.continue语句 2.break语句 3.return语句 return语句用于终止当前的命令序列,并返回到调用的函数或键盘,也用于终止keyboard方式。在MATLAB中,被调用的函数运行结束后台自动返回到调用函数,使用return语句时将return插入被调用函数的某一位置,根据某种条件迫使被调用函数提前结束并返回调用。

4.2程序的流程控制五、其他语句例:exam4_2_8.m%输入考试分数,最多输入10人,用-1作业结束标志,若输入大于100,%或小于0,则提示重新输入,最后计算最高分、最低分和平均值。 clear all; i=1; while 1%一直循环end a i_max=max(a) i_min=min(a) i_mean=mean(a) end if i>10 return end

4.2程序的流程控制五、其他语句break; else continue; end%直接进行下一次循环%跳出循环

%返回

x=input(['请输入学生',num2str(i),'的成绩:']); if x>=0& x<=100 a(i)=x; i=i+1; else if x== -1

4.2程序的流程控制五、其他语句exam4_2_8.m说明:(1)当输入-1时,break语句起作用,程序跳出循环,计算最大、最小和平均值。 (2)当成绩超范围时,continue语句起作用,程序直接循环,重新输入同一学生的成绩。 (3)当人数超过10人时,return语句起作用,程序直接结束,不计算最大、最小和平均值。

4.2、程序的流程控制五、其他语句

第(1)种情况

MATLAB程序设计与应用

4.2、程序的流程控制五、其他语句

4.2、程序

的流程控制五、其他语句

第(2)种情况

第(3)种情况

第4章 MATLAB程序设计4.1 M文件介绍 4.2程序的流程控制 4.3 M文件函数一、函数的定义二、函数的注释和原则三、函数的参数四、函数的调用

4.3 M文件函数一、函数的定义Matlab自定义函数方式有以下几种: 1、命令文件/函数文件+函数文件:多个 M文件 2、函数文件+子函数: 3、inline: 4、subs: 5、几种定义出错的情况一个 M文件无需 M文件无需 M文件

4.4程序的调试与优化

一、函数的定义1、命令文件/函数文件+函数文件:多个 M文件%命令/函数文件:exam4_3_2.m clear调用函数时要注意实参与形参的匹配! for t=1:10; y=mysqrt(t); fprintf('%4d^(1/2)=%6.4f\n',t,y); end函数必须单独写一个文件!不能与命令文件写在同一个文件中!%函数文件:mysqrt.m function y= mysqrt(x) y=x^(1/2);

4.3 M文件函数一、函数的定义2、函数文件+子函数:一个 M文件函数文件中可以定义一个或多个子函数,此时我们称该函数为主函数,子函数只能被主函数或同一个函数文件中的其它子函数调用!%函数文件:exam4_3_3.m function[]=exam4_3_3() for t=1:10 y=lfg2(t); fprintf('%4d^(1/3)=%6.4f\n',t,y); end function y=lfg2(x) y=x^(1/2);%%子函数

函数名与文件名必须一致!

MATLAB程序设计与应用

4.3 M文件函数一、函数的定义3、 inline:无需 M文件inline命令可以用来定义一个内联函数 f=inline('函数表达式','变量1','变量2',...)调用方式:y=f(数值列表)注意:代入的数值列表顺序应与定义时的变量名顺序一致

4.3 M文件函数一、函数的定义3、 inline:无需 M文件优点:这种函数定义方式是将 f作为一个内部函数调用。其特点是:调用方式最接近于我们平时对函数的定义,使程序更具可读性。同时由于它是基于 Matlab的数值计算内核的,所以它的运算速度较快,程序更有效率。缺点:定义一个内联函数用去的内存空间比相同条件下其他的方法要大得多。且该方法只能对数值进行代入,不支持符号代入,并且对于定义后的函数不能进行求导等符号运算。

例:>> fun_add=inline('x+y','x','y')>> z=fun_add(2,3) z=5

4.3 M文件函数一、函数的定义4、subs:无需 M文件 syms定义一个符号表达式,用 subs命令调用subs调用格式:subs(s,new)利用new的值代替符号表达式S中的默认符号 subs(s,old,new)利用new的值代替符号表达式中old的值,old为符号变量或是字符串变量名。new是一个符号货数值变量或表达式。还有其他调用方式,感兴趣的同学可以自学。

4.3 M文件函数一、函数的定义4、subs:无需 M文件例:>> syms x y;>> y=subs(2*x+1,'2*c+1');%用’2*c+1’替换’2*x+1’中的x y= 2*(2*c+1)+1>> exp

and(y) ans= 4*c+3%替换的表达式没有参与运算%将y表达式展开

4.3 M文件函数一、函数的定义4、subs:无需 M文件例:>>syms x y;>>y=2*x+1>>subs(y,x,‘2*c+1’)%替换的表达式参与运算

4.3 M文件函数一、函数的定义4、subs:无需 M文件例:%subs(符号表达式,替换前的符号变量,替换后的符号变量);>> syms x y>> y= 2*x+1 y= 2*x+ 1>> subs(y,x,'3*c+1') ans=

%subs(符号表达式,替换前的符号变量,替换后的符号变量); ans= 4*c+3

6*c+ 3

MATLAB程序设计与应用

一、函数的定义4、符号表达式+ subs方式:无需 M文件优点:这种函数定义方法的一个特点是可以用符号进行替换。缺点:该方法的缺点也是明显的:由于使用符号运算内核,运算速度会大大降低。注:对于在 syms中已经定义过符号变量,在 subs中进行替代时,单引号可以省略。但如果在 syms后又被重新定义为其它类型,则必须加单引号,否则不可替换。

符号表达式的生成MATLAB语言中,提供了两个函数“sym”和“syms”,定义符号数、符号变量、符号对象等。syms是一次定义多个符号对象的简捷方法

sym函数语法格式为:S=sym(A)基于已知A,创建对象S为符号。如果A输入的是一段字符,那么结果就是由这段字符为名字的符号变量如果输入的是一个数和数值矩阵,那么结果符号S代表符号数或符号矩阵。

符号表达式的生成MATLAB语言中,提供了两个函数“sym”和“syms”,定义符号数、符号变量、符号对象等。注意:符号数与数值数是不同的,符号数是严格准确的,数值数通常都是近似的。例如:a=sym(‘1/3’); b=1/3; digits、vpa两函数,可将符号数转化为数值数函数digits决定Maple数值计算的有效位数语法格式:digits(D),将计算有效位数值设为D整数,相当于D=digits

一、函数的定义5、几种定义出错的情况

R=vpa(S)对符号矩阵S进行数值估算,有效位数为当前默认有效位数。也可以R=vpa(S,D)对符号矩阵S进行数值估算,有效位数为D。

一、函数的定义5、几种定义出错的情况

一、函数的定义5、几种定义出错的情况下面来看一下某个同学用MATLAB定义函数的过程。

直接在命令窗口定义函数是错误的,应新建m文件然后再定义,要注意系统的出错提示,了解出错的原因。 EVAL是一个函数,把字符串当命令执行,格式如下 EVAL(s):s为一个字符串,感兴趣的同学可以查help EVAL

MATLAB程序设计与应用

一、函数的定义5、几种定义出错的情况下面来看一下某个同学用MATLAB定义函数的过程。

5、几种定义出错的情况下面来看一下某个同学用MATLAB定义函数的过程。删除第一行,另存为myplus1.m这里又犯了一个错误,函数文件名和函数不一致!

运行出错

!系统提示:不能在脚本文件中定义函数。原因:函数定义语句前可以有注释,但不能有其他命令。

一、函数的定义5、几种定义出错的情况下面来看一下某个同学用MATLAB定义函数的过程。

一、函数的定义5、几种定义出错的情况下面来看一下某个同学用MATLAB定义函数的过程。

运行继续出错,因为刚才函数文件保存为myplus1.m,该同学灵机一动,试了一下c=myplus1(1,2)

这一次系统竟然没有报错!但这种做法在高版本的MATLAB仍会报错!

4.3 M文件函数二、函数的注释和原则在函数M文件中,到第一个非注释行为止的注释行是帮助文本。当需要帮助时,返回该文本。第一行帮助行,名为H1行,是由lookfor命令搜索的行。这一知识点的内容很少,也很好理解,但非常重要,很多同学忽视注释的重要性,注释是告诉读者程序编写目的及其工作原理的主要机制。当决定某个注释是否合适的时候,请先问下自己:“对于第一次读此程序的程序员而言,他们想要知道什么”?很多同学自己编的程序,过几个月再看,他自己也看不懂。

4.3 M文件函数一、函数的定义二、函数的注释和原则注释很好写,但是要写好,却不容易,注释的内容不要解释你的代码是如何如何的好,应该将代码写得更好,而不是花费大量的时间去解释你的的代码。通常情况下,注释内容应该是说明代码做些什么,而不是怎么做的。函数应该尽量精简,代码不要太长,一般一到两个屏幕,功能尽量单一,最好一个函数只作一件事情,而且将它做好。

三、函数的参数

MATLAB程序设计与应用

4.3 M文件函数三、函数的参数函数可以有零个或更多个输入参量。函数可以有零个或更多个输出参量。函数可以按少于函数M文件中所规定的输入和输出变量进行调用,但不能用多于函数M文件中所规定的输入和输出变量数目。如果输入和输出变量数目多于函数M文件中function语句一开始所规定的数目,则调用时自动返回一个错误。当调用一个函数时,所用的输入和输出的参量的数目,在函数内是规定好的。函数工作空间变量nargin包含输入参量个数;函数工作空间变量nargout包含输出参量个数。事实上,这些变量常用来设置缺省输入变量,并决定用户所希望的输出变量。

4.3 M文件函数一、函数的定义二、函数的注释和原则三、函数的参数emam4_3_4.m function r=exam4_3_4(x1,x2,x3,x4,x5) r=nargin; r=输入参数的个数,最多为5个参数。

4.3、M文件函数三、函数的参数

4.3、M文件函数一、函数的定义二、函数的注释和原则三、函数的参数四、函数的调用函数定义完成后可以在很多地方被调用:如命令窗口、m

命令文件、其他函数,甚至函数自已。函数可以递归调用。即M文件函数能调用它们本身。例:exam4_3_5

4.3、M文件函数四、函数的调用function exam4_3_5(n)%有一个好忘事的人,希望这个程序能提醒他做作业。%变量n为提醒的次数 if nargin==0,n=10;end%如果没有输入参数,n默认为10 if n>1 disp(' I will remember to do my homework. ') exam4_3_5(n-1) else disp(' Maybe NOT! ') end%递归调用

4.3、M文件函数四、函数的调用

MATLAB程序设计与应用

第4章 MATLAB程序设计4.1 M文件介绍 4.2程序的流程控制 4.3 M文件函数 4.4程序的调试与优化一、程序错误二、程序的直接调试三、断点调试四、程序的优化

4.4程序的调试与优化一、程序错误在程序设计中不可避免地会出现各种各样的错误,一般来说可以归纳为两种:语法错误运行错误语法错误通常是在程序输入时产生的,如函数名拼写错误、括号不匹配等问题。由于这些错误的存在,程序不能完成全部运行过程,会在发现错误时停止运行,并在命令窗口显示错误信息,因此这类错误在运行的过程中就能够被发现,并可以通过对程序的调试较容易地得到修改。

4.4、程序的调试与优化一、程序错误运行错误通常是在算法上发生了错误,例如错误地修改某个变量或完成一个不正确的计算,当产生这些意想不到的错误结果时,就出现了运行错误。另外还有一些错误可能是由于解题思路不正确或对问题的理解不准确而引起的,通常在运行时不会有错误信息输出,只有发现计算结果有较大的偏差或不符合设计要求时,才能根据结果的差异进行分析和判断。这可能是一个比较复杂的过程。在这里只介绍语法错误和运行错误的调试方法。通常对于简单的程序可以用直接调试的方法进行修改,对于一些比较复杂程序的调试则需要借助于程序调试器(Debugger)。 3. 4.

4.4、程序的调试与优化二、程序的调试对于简单的程序,可以进行直接调试与修改,直接调试法包括以下几个方面: 1. 2.如果在错误信息中指出了出错的行数,可先根据锗误信息检查该语句是否存在语法错误或运算中变量尺寸不一致等情况。检查所调用的函数或命令的拼写是否正确,括号(包括方括号和圆括号)是否配对,各种流程控制语句是否匹配(如for与end、while与end、switch与end等)。检查所调用的函数或要载入的数据文件是否在当前日录或搜索路径上。将重点怀疑的命令行后的分号删除或改成逗号,使得计算结果能够

4.4、程序的调试与优化二、程序的调试续前:实时地显示在屏幕上,根据显示的结果判断问题的所在。 5.利用echo命令,可以在运行时将文件的内容显示在屏幕上。

echo on用于显示命令文件的执行过程,但不显示被调用函数文件的内容,如果希望检查函数文件中的内容,用echo Funname on显示文件名为Funname的函数文件的执行过程。一般情况下,为了能够观察清楚,建议不要同时使用echo on和echo Funname on,或同时显示多个函数文件的内容,分别检查会更容易查找错误的位置。 echo off用于关闭命令文件的执行过程显示,echo Funname off用于关闭函数文件的执行过程显示。 7. 6.

4.4程序的调试与优化二、程序的调试在程序文件的适当位置添加keyboard命令,当运行中的程序遇到 keyboard命令时会暂时停止运行,将控制权交给链盘,这时命令窗口提示符变为K>>,可以在命令窗口键入变量名,以检查各变量的内容是否正确,也可键入命令修改变量。检查或修改完成后,键入return命令,控制权交还给系统,程序将继续运行。如果怀疑某个函数文件有问题。可以在该函数文件的函数定义行前加%,使之变为可以观察中间变量的命令文件(因为命令文件中的变量存储在工作中间中,可以在工作空间浏览器和数组编辑器观察和修改)。如果函数文件规模较大,文件嵌套复杂,或调用铰多的函数时,可以借助于专门的调试工具——程序调试器 (Debugger)。

MATLAB程序设计与应用

4.4程序的调试与优化三、断点调试1、设置断点MATLAB自带的m文件编辑器提供了断点调试功能,打开m文件编辑器在菜单栏中Breakpoints菜单提供了设置和清除断点的方法。 Set/Clear Breakpoint F12设置或清除当前行的断点,快捷键为F12 Clear All Breakpoints清除所有断点

4.4程序的调试与优化三、断点调试1、设置断点Stop If Error Stop If Warning出现错误时中断出现警告时中断

Stop If NaN Or Inf出现非法数时中断 Stop If All Error出现所有错误时中断

除了菜单以外,用鼠标在行号后面的-线上单击一下,也可设置一个断点,这时-线变成红圆点,再单击一下红圆点,可清除当前断点,红圆点又变成-线。

——————————————————以下为四种程序中断模式,可单选也可多选。

4.4程序的调试与优化三、断点调试2、设置断点异常设置断点后,有时会弹出出错提示框,这说明程序有语法错误。例:exam4_4_1.m

4.4程序的调试与优化三、断点调试1、设置断点 2、设置断点异常 3、断点调试在程序中断后,执行中断的断点后会有一个绿色箭头,这个在多个断点的程序中很有用,它指出那一个断点在起作用。中断同时MATLAB命令窗口出现 K>>提示符,把控制权交给键盘,此时可以查看和修改函数中变量的值,键入return可返回。

4.4、程序的调试与优化三、断点调试

MATLAB程序设计与应用

4.4程序的

调试与优化三、断点调试3、断点调试为什么要输入两次return?因为在程序中设置了3个断点,刚才程序运行过程中碰到了2个,所以要输入两次return才能返回系统。中断以后系统Debug菜单提供了几种调试方法 (在没中断时为灰色) Step Step in一步一步运行,如遇到函数,直接完成,不进入函数内部一步一步运行,如遇到调用函数,深入函数内部调试

4.4、程序的调试与优化三、断点调试3、断点调试为什么要输入两次return?因为在程序中设置了3个断点,刚才程序运行过程中碰到了2个,所以要输入两次return才能返回系统。

Step out一步一步运行,如在调用函数内,则返回主程序 Continue继续运行程序。

4.4程序的调试与优化一、程序错误二、程序的调试三、断点调试四、程序的优化1、优化的内容 2、数据的预定义 3、以矩阵运算代替循环运算 4、多用函数,少用脚本文件

4.4程序的调试与优化四、程序的优化1、优化的内容代码调整:代码调整是一种局部的思维方式;基本上不触及算法层级,它面向的是代码,而不是问题更高层级优化包括改进算法、改进程序架构等等,由于课程的时间有限,这里不做详细介绍,感兴趣的同学可以参考相关书籍。

4.4程序的调试与优化四、程序的优化2、数据的预定义虽然在MATLAB中没有规定变量使用时必须预先定义,但是对于未定义的变量,如果操作过程中出现越界赋值等问题,系统将不得不对变量进行扩充,这样的操作大大降低了程序运行的效率。所以对于可能出现变量维数不断扩大的问题时,应当预先估计变量可能出现的的维数,进行预定义。

4.4程序的调试与优化四、程序的优化3、以矩阵运算代替循环运算循环运算是MATLAB语言的一个弱点,在程序设计时,应当尽可能避免循环运算。由于矩阵运算是MATLAB的核心,因此,在MATLAB编程过程中应当强调对矩阵的整体运算,减少和避免对矩阵元素的操作,尽可能将循环运算转换为矩阵运算。

MATLAB程序设计与应用

4.4程序的调试与优化四、程序的优化4、多用函数,少用脚本文件M文件函数在运行前会编译成存储器的内部表示,即使它被其他函数调用也一样会被编译。普通的脚本M文件不被编译,即使它们是从函数M文件内调用;打开脚本M文件,调用一次就逐行进行注释。从函数M文件内可以调用脚本文件。在这种情况下,脚本文件查看函数工作空间,不查看MATLAB工作空间。从函数M文件内调用的脚本文件不必用调用函数编译到内存。函数每调用一次,它们就被打开和解释。因此,从函数M文件内调用脚本文件减慢了函数的执行。

本文来源:https://www.bwwdw.com/article/7kj1.html

Top