1、第3章MATLAB程序设计【本章学习目标】掌握建立和执行脚本的方法。掌握利用if语句、switch语句实现选择结构的方法。掌握利用for语句、while语句实现循环结构的方法。熟悉利用向量运算来代替循环操作的方法。掌握定义和调用MATLAB函数的方法。3.1 脚本MATLAB命令执行方式 交互式的命令执行方式:在命令行窗口逐条输入命令,MATLAB逐条解释执行。脚本方式:将有关命令编成程序存储在一个扩展名为.m的文件中,每次运行该脚本,MATLAB就会自动依次执行脚本中的命令。3.1 脚本1MATLAB编辑器MATLAB编辑器界面包括功能区和编辑区两个部分。3.1.1 脚本的编辑功能区编辑区3
2、.1 脚本2启动MATLAB编辑器(1)单击 MATLAB桌面的“主页”选项卡工具条中的“新建脚本”按钮(2)在MATLAB命令行窗口输入命令:edit 文件名(3)在“命令历史记录”面板选中一些命令(按住Ctrl键可同时选择多条命令),然后从右键菜单中选择“创建脚本”命令3.1.1 脚本的编辑3.1 脚本【例3.1】建立一个脚本,其功能是:用两个实变量R、M生成复变量RM,然后运行该脚本。建立脚本文件并以文件名setcomp.m保存在当前目录下。3.1.1 脚本的编辑clear;R=1,2,3;4,5,6;M=11,12,13;14,15,16;RM=complex(R,M);在MATLAB
3、编辑器的“编辑器”选项卡中单击“运行”按钮,或在MATLAB的命令行窗口中输入脚本文件名:setcomp,然后按Enter键。3.1 脚本1实时编辑器实时脚本在MATLAB实时编辑器中创建、编辑、调试。3.1.2 实时脚本功能区编辑区输出区3.1 脚本2启动MATLAB实时编辑器(1)单击MATLAB桌面的“主页”选项卡工具条中的“新建实时脚本”按钮(2)在MATLAB命令行窗口输入命令:edit 文件名.mlx(3)在命令历史记录面板选中一些命令(按住Ctrl可同时选多条命令),然后从右键快捷菜单中选择“创建实时脚本”命令3.1.2 实时脚本3.1 脚本3 3代码的分节运行代码的分节运行实时
4、脚本通常包含很多命令,有时只需要运行其中一部分,这时可通过设置分节标志,将全部代码分成若干代码片段(也称为代码单元)。3.1.2 实时脚本3.2 程序控制结构结构1input函数用于打开一个输入框来获取数据,该函数的调用格式为:A=input(提示信息)其中,提示信息为一个字符串,用于提示用户输入什么样的数据。3.2.1 顺序结构 A=input(输入A矩阵:)输入A矩阵:1,2,3;4,5,6A=1 2 3 4 5 6若要输入一个字符串,输入的字符串前后加单撇号或双引号,界定字符串的起始和结束。3.2 程序控制结构结构1input函数若要输入一个字符串,输入的字符串前后加单撇号或双引号,界定
5、字符串的起始和结束。输入一个字符串也可以使用以下调用方法:A=input(提示信息,s)3.2.1 顺序结构 xm=input(Whats your name?,s)Whats your name?Tommy Tunexm=Tommy Tune xm=input(What is your name?)What is your name?Tommy Tunexm=Tommy Tune3.2 程序控制结构结构2disp函数用于在命令窗口显示变量和表达式的值,其调用格式为disp(输出项)其中,输出项既可以为字符串,也可以为矩阵。3.2.1 顺序结构 A=Hello,World!;disp(A)He
6、llo,World!A=1,2,3;4,5,6;disp(A)1 2 3 4 5 63.2 程序控制结构结构1if语句3.2.2 选择结构if 条件1 语句块1elseif 条件2 语句块2elseif 条件n 语句块nelse 语句块n+1end 图3.3 if语句的执行过程3.2 程序控制结构结构【例3.2】计算分段函数:3.2.2 选择结构x=input(请输入x的值:);if x0 y=abs(x);elseif x10 y=sin(x)./(x+1);elseif x=A&c=a&c=0&c=9 disp(str2double(c)2);else disp(c);end3.2 程序控
7、制结构结构2switch语句3.2.2 选择结构switch 测试表达式 case 结果表1 语句块1 case 结果表2 语句块2 case 结果表n 语句块n otherwise 语句块n+1 end图3.4 switch语句的执行过程 3.2 程序控制结构结构【例3.4】输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应数的平方,若为其他字符则原样输出。3.2.2 选择结构c=input(请输入一个字符:,s);switch c case num2cell(A:Z)disp(lower(c);case num2cell(a:
8、z)disp(upper(c);case num2cell(0:9)disp(c-0)2);otherwise disp(c);end3.2 程序控制结构结构3try语句一种试探性执行语句,为开发人员提供了一种捕获错误的机制,其格式为:3.2.2 选择结构try 语句块1catch 变量 语句块2endtry语句先试探性执行语句块1,如果语句块1在执行过程中出现错误,则将错误信息赋给catch后的变量,并转去执行语句块2。catch后的变量是一个MException类的对象,其message属性用于返回错误的说明。3.2 程序控制结构结构【例3.5】矩阵乘法运算要求两矩阵的维度相容,否则会出错
9、。编写程序,求两矩阵的乘积,若出错,则显示出错的原因。3.2.2 选择结构A=input(请输入A矩阵:);B=input(请输入B矩阵:);try C=A*B;disp(C)catch err disp(err.message)end程序执行结果如下:请输入A矩阵:1,2,3;4,5,6请输入B矩阵:7,8,9;10,11,12内部矩阵维度必须一致3.2 程序控制结构结构1for语句用于处理能事先确定循环次数的情况。其中,表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。3.2.3 循环结构for 循环变量=表达式1:表达式2:表达
10、式3 循环体语句end图3.5 for语句执行过程3.2 程序控制结构结构【例3.6】一个各位数字的立方和等于该数本身的3位整数称为水仙花数。输出全部水仙花数。3.2.3 循环结构shu=;%建立一个空矩阵shu,用于存放结果for n=100:999 n1=fix(n/100);%求n的百位数字 n2=mod(fix(n/10),10);%求n的十位数字 n3=mod(n,10);%求n的个位数字 if n=n1*n1*n1+n2*n2*n2+n3*n3*n3 shu=shu,n;%存入结果 endenddisp(shu)3.2 程序控制结构结构【例3.7】已知 ,求y的值。3.2.3 循环
11、结构y=0;n=100;f=1;for i=1:n y=y+f/i;f=-f;enddisp(y=,num2str(y)11111234100y 3.2 程序控制结构结构在MATLAB中,for语句也可以采用以下格式:for 循环变量=矩阵 循环体语句End【例3.8】写出下列程序的执行结果。3.2.3 循环结构s=0;a=1,2,3,4;31,41,51,61;101,102,103,104;for k=a s=s+k;enddisp(s)3.2 程序控制结构结构2while语句3.2.3 循环结构While 条件 循环体语句end 图3.6 while语句执行过程3.2 程序控制结构结构【
12、例3.9】求使 的最小的n。3.2.3 循环结构y=0;n=0;while(y=1.5)n=n+1;y=y+1/n/n;enddisp(满足条件的n是:,num2str(n)222211111.5123n3.2 程序控制结构结构3break语句和continue语句break语句用于终止循环的执行。continue语句控制跳过循环体中的某些语句。3.2.3 循环结构3.2 程序控制结构结构【例3.10】输入两个整数,求它们的最小公倍数。3.2.3 循环结构x=input(请输入第一个数:);y=input(请输入第二个数:);z1=max(x,y);z=0;while z a1,a2=sumf
13、raction(2,5)a1=1.0929a2=0.35713.3 函数数【例3.14】n的阶乘在数学上定义为:3.3.2 函数调用函数文件factorialfun.m定义如下:function f=factorialfun(n)if n fun1=(x)3*x.*x+5*x+6;a=1:1:4;c=fun1(a)c=14 28 48 74 fun2=(x,y)x.*x-y.*y;a=7:10;b=1:4;z=fun2(a,b)z=48 60 72 843.3 函数数函数文件中的变量的作用域默认是局部的全局变量用global命令定义,命令格式为:global var1 var2.varN变量v
14、ar1、var2、varN之间用空格分隔。3.3.5 全局变量与局部变量3.3 函数数【例3.16】全局变量应用示例。先建立函数文件wmean.m,该函数计算输入参数加权平均值。建立的脚本文件meanmain.m,调用函数wmean。3.3.5 全局变量与局部变量function f=wmean(x,y)global w1 w2;f=(w1*x+w2*y)/(w1+w2);global w1 w2w1=3;w2=4;wavemean=wmean(92,86);disp(加权平均值为:,num2str(wavemean)3.4 程 序 调调 试试应用程序的错误有两类 语法错误:语法或文法的错误,
15、如函数名拼写错、表达式书写错、数据类型错误等 运行时的错误:程序的运行结果有错误,也称为程序逻辑错误。常用的办法:通过观测中间结果来发现错误可能发生的程序段,以便进一步分析错误的原因。3.4.1 程序调试概述3.4 程 序 调调 试试应用程序的错误有两类 语法错误:语法或文法的错误,如函数名拼写错、表达式书写错、数据类型错误等 运行时的错误:程序的运行结果有错误,也称为程序逻辑错误。常用的办法:通过观测中间结果来发现错误可能发生的程序段,以便进一步分析错误的原因。(1)使用MATLAB编辑器,在打开的脚本中设置断点。(2)在命令行窗口里调用调试函数3.4.1 程序调试概述3.4 程 序 调调
16、试试MATLAB编译器提供3类与调试有关的功能模块“断点”命令组提供设置、清除断点的命令“运行”命令组提供运行脚本的命令“调试”命令组提供调试中的控制单步运行的命令。1断点操作2控制单步运行3.4.2 MATLAB调试模块3.4 程 序 调调 试试【例3.17】在如图3.8所示的编辑器窗口中,有一个求两个数的最小公倍数的程序commulti.m,试设置断点来控制程序执行。3.4.2 MATLAB调试模块3.5 程序性能分析与优与优化利用MATLAB的探查器、tic函数和toc函数提供的分析报告能帮助用户探寻影响程序运行速度的“瓶颈”所在,以便于进行代码优化。打开探查器有3种方法:(1)在命令行
17、窗口中调用profile函数。(2)单击MATLAB桌面“主页”选项卡中的“运行并计时”按钮。(3)单击MATLAB编辑器的“编辑器”选项卡中的“运行并计时”按钮。3.5.1 程序性能分析3.5 程序性能分析与优与优化假定当前文件夹下有脚本文件profilertest.m,文件中包含如下代码:t=linspace(0,2*pi,100);x=sin(t);y=t.*cos(t);plot(x,y)在MATLAB的命令行窗口输入以下命令:profile on profilertest profile viewer3.5.1 程序性能分析3.5 程序性能分析与优与优化3.5.2 程序优化用循环结构
18、实现,程序如下:n=100000;y=0;for x=1:n y=y+1/x/(x+1);end用向量求和的方法实现,程序如下:n=100000;vx=1:n;x=1./vx./(vx+1);y=sum(x);后一种方法比前一种方法运行时间短。3.5 程序性能分析与优与优化(2)预分配内存空间。通过在循环之前预分配向量或数组的内存空间可以提高for循环的处理速度。3.5.2 程序优化程序1:clear;a=0;for n=2:10000 a(n)=a(n-1)+10;end程序2:clear;a=zeros(1,10000);for n=2:10000 a(n)=a(n-1)+10;end程序2采用了预定义矩阵的方法,运行时间比程序1要短。3.5 程序性能分析与优与优化(3)减小运算强度。一般来说,加法比乘法运算快,乘法比乘方运算快,位运算比求余运算快。3.5.2 程序优化clear;a=fix(rand(1000)*10);%生成一个10001000的矩阵x=a.4;y=a.*a.*a.*a;a.*a.*a.*a运算比a.4运算所花的时间少得多。