第3章〓MATLAB程序设计基础MATLAB程序设计既有传统高级语言的特征,又有自己独特的优点。在MATLAB程序设计时,充分利用MATLAB数据结构的特点,可以使程序结构简单、编程效率高。本章介绍有关MATLAB程序控制结构以及程序设计的基本方法。 3.1脚本文件和函数文件 MATLAB在执行命令时,是一种交互的命令执行方式,在命令窗口逐条输入指令,执行时MATLAB逐条解脚本文件和函数文件释执行。这种方式虽然简单、直观,但速度慢,执行过程不保留,当某些操作需要反复进行时,更使人感到不便。另一种M文件的程序执行方式,是将有关命令变成程序存储在一个文件中(M文件),当需要运行时,直接调用运行,运行时MATLAB就自动依次执行该文件中的命令。 M文件可分为两大类: M脚本文件和M函数文件,这两种MATLAB程序代码所编写的文件通常都是以m为扩展名,因此都统称为M文件。M函数文件是MATLAB的主流。MATLAB本身的一系列工具箱的内部函数就是MATLAB的开发者设计的一些M函数,提供给人们使用。 MATLAB的脚本文件(script File)比较简单,当需要在命令窗口运行大量的命令时,直接从命令窗口输入比较麻烦,可以打开M文件编辑器,将这组命令存放在脚本文件中,运行时只要输入脚本文件名,MATLAB就会自动执行该文件。打开M文件编辑器的方式因MATLAB的版本不同稍有区别,在MATLAB R2011a版本中,执行File→new→script命令,即可打开脚本文件的编辑器,执行File→new→function命令,即可打开函数文件的编辑器。函数文件的标志就是以function开头,如图31所示。 脚本文件可在命令窗口直接执行,也称为命令文件,直接输入文件名即可执行。例如,文件名为f1.m,则在命令窗口直接输入f1即可执行这个脚本文件,得到运行结果,如图32所示,其变量定义在工作空间中。科学计算与MATLAB(微课版)第3章MATLAB程序设计基础图31定义函数文件 图32脚本文件的运行方式 函数文件是定义一个函数(function),不能在编辑器窗口直接执行,而必须以函数调用的方式来执行它。函数文件在保存时需要文件名和函数名一致。当函数文件名与函数名不相同时,MATLAB将忽略函数名,调用时使用函数文件名。例如,函数名为f2,那么保存的文件名也应该为f2,在命令窗口调用函数时,使用如下的一般调用形式:函数名(实际参数)例如f2(a,b),函数文件的定义和调用如图33所示。 图33函数文件的定义和调用3.2顺序结构程序设计 顺序结构是指按照程序中语句的排列顺序依次执行,直到程序的最后一个语句。这也是最简单的一种程序输入和输出结构。一般涉及数据的输入、数据的计算或处理、数据的输出等内容。 1. 数据的输入 从键盘输入数据,可使用input函数来实现,其格式为A=input(提示信息,选项);其中,提示信息为字符串,用于提示用户输入什么样的数据。例如:A=input('请输入A矩阵:');如果在input函数调用时采用's'选项,则允许用户输入一个字符串。例如,想输入一个人的姓名,可采用命令:xm=input ('What''s your name?', 's') 2. 数据的输出 MATLAB提供的命令窗口输出函数主要有disp函数和fprintf函数。 1) disp函数将数据输出到MATLAB的命令窗口 disp函数的调用格式为disp(输出项)其中,输出项既可以是字符串,也可以是矩阵。 用disp函数显示矩阵时将不显示矩阵的名字,而且其格式更紧密,且不留任何没有意义的空行。 2) 用fprintf函数格式化输出数据到文件中 fprintf函数显示带有相关文本的一个或多个值,允许程序员控制显示数据的方式。它在命令行窗口打印一个数据的一般格式如下:fprintf(文件句柄fid,格式format,数据data)其中,fid表示由fopen函数打开的文件句柄,如果fid省略,则直接输出在屏幕上;format用于表示一个描述打印数据方式的字符串;data代表要打印的一个或多个标量或数组。format包括两方面的内容: 一方面是打印文本内容;另一方面是打印内容中的数据格式。例如:>>fprintf('the value of pi is%6.2f\\n',pi) the value of pi is3.14打印的结果为the value of pi is 3.14,后面带有一个换行符。转义序列%6.2f代表在本函数中的第一个数据项将占有6个字符宽度,小数点后有2位小数。 fprintf函数有一个重大的局限性,只能显示复数的实部。当计算结果是复数时,这个局限性将会产生错误。在这种情况下,最好用disp显示数据。 format命令中格式符的含义如表31所示。表31format命令中格式符的含义 格式符功能%d把值作为整数来处理%e用科学记数法来显示数据%f用于格式化浮点数,并显示这个数%g用科学记数格式,或浮点数格式,根据长度最短的显示\\n换行符3. 程序的暂停 MATLAB中程序暂停函数的调用格式为pause(延时秒数)若省去延时秒数,直到用户按任意键程序继续执行,按Ctrl+C键强行中止程序的执行。 例如,要求输入两个同型矩阵,然后求两个矩阵的和,再将结果显示在屏幕上。定义脚本文件如图34(a)所示,文件名为f3.m。运行时,在命令窗口输入文件名f3,出现提示信息“输入矩阵a”,此时输入[1 2 3;4 5 6]并回车,再出现提示信息“输入矩阵b”,此时输入[5 6 7;2 3 4],则显示运行结果,如图34(b)所示。 图34input函数和disp函数举例 3.3选择结构程序设计 选择结构又称为分支结构,是根据给定的条件是否成立来决定程序的执行流程。 MATLAB中可以用if语句、switch语句和try语句实现选择结构。 if语句1. if语句 MATLAB中,if语句有3种格式。 1) 单分支if语句 格式:if条件 语句组 end如果条件成立就执行语句组,条件通常是关系表达式或逻辑表达式,当条件结果为标量时,非0表示条件成立,0表示条件不成立;当条件结果为矩阵时,如果矩阵为非空,且不包含0元素,条件成立,否则不成立。 例如,[1,2;0,3]表示条件时,条件不成立;[1,2;3,4]表示条件时,条件成立。 2) 双分支if语句 格式:if条件 语句组1 else 语句组2 end如果条件成立则执行语句组1,否则执行语句组2。 3) 多分支if语句 格式:if条件1 语句组1 elseif条件2 语句组2 …… elseif条件m 语句组m else 语句组n end【例3.1】编写程序完成以下分段函数,要求输入x的值,输出相应的y值。y=1,x>00,x=0-1,x<0程序和运行过程见图35,这里脚本文件保存为l7sd.m。在命令窗口输入l7sd,出现输入提示符“输入x”,输入一个值后,即可看到运算结果。程序中的num2str函数的功能是将数字转换为字符串。 图35分段函数脚本文件的定义和调用 【例3.2】编写函数,完成符号函数的功能。 首先要定义函数,计算符号函数时,需要已知x,因此函数要有一个形式参数x,再给函数一个名字,这里用ff3。这样,函数首部即可确定为functiony=ff3(x),当x为形参时,它的值是调用函数时传递过来的,所以在函数中无须也不能再输入x,即当x为已知时,求完函数值也不在函数内打印,而是由函数名带回到调用它的位置,详见图36。 图36分段函数的函数文件的定义和调用 【例3.3】输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应数的平方;若为其他字符则原样输出。c=input('请输入一个字符: ','s'); if c>='A' && c<='Z' disp(lower(c)) elseif c>='a' && c<='z' disp(upper(c)) elseif c>='0' && c<='9' disp(str2double(c)^2) else disp(c) end switch和try语句2. switch语句 switch语句是根据表达式的取值不同,分别执行不同的语句,其语句格式为switch表达式 case表达式1 语句组1 case表达式2 语句组2 …… case表达式m 语句组m otherwise 语句组n end【例3.4】输入某个学生的成绩g(假设0≤g≤100)。如果g≥90,输出A;80≤g<90,输出B;70≤g<80,输出C;60≤g<70,输出D;g<60,输出E。 建立脚本文件,取名swi1.m,程序代码如下:x=input('输入整数成绩'); switch(fix(x/10)) case {9,10} disp('A') case 8 disp('B') case 7 disp('C') case 6 disp('D') otherwise disp('E') end在命令窗口输入swi1,输入88,得到B。>>swi1 输入整数成绩88 B 3. try语句 try语句是一种试探性执行语句,其语句格式为try 语句组1 catch 语句组2 endtry语句先试探执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息保留在lasterr变量中,并转去执行语句组2。 图37的例子为使用try语句试探两个矩阵相乘,如果不能进行矩阵乘法,就进行点乘。执行C=AB时出错,因为第一个矩阵的列数和第二个矩阵的行数不相等,不能进行矩阵乘法,转去执行C=A.B,即两个矩阵的对应元素相乘。结果C矩阵就是矩阵点乘的结果,最后输出错误信息。如果文件最后没有lasterr一行,则不会输出错误信息。 图37try语句举例3.4循环结构程序设计 循环是指按照给定的条件,重复执行指定的语句,这是十分重要的一种程序结构。MATLAB提供了两种实现循环的结构语句: for语句和while语句。 for语句1. for语句 1) 简单格式for循环变量=循环初值:步长:终值 循环体语句 end【例3.5】一个3位整数,其各位数字的立方和等于该数本身则称为水仙花数,求出100~999的全部水仙花数。for m=100:999; m1=fix(m/100); %求m的百位数字,fix向0方向取整 m2=rem(fix(m/10),10);%求m的十位数字 m3=rem(m,10); %求m的个位数字 if m==m1m1m1+m2m2m2+m3m3m3 disp(m) end end2) for更一般的表达式for循环变量=矩阵表达式 循环体语句 end执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直至各列元素处理完毕。实际上,“初值:增量:终值”是一个仅为一行的矩阵(行向量),因而列向量是单个数据。 【例3.6】矩阵作为循环变量。a矩阵中存放的是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; end disp(s');结果为275 340 300 271 319while和break语句即将4列加在一起,得到5个学生的4门课的成绩总和,输出的是s的转置,所以是一行结果。 2. while语句 while语句的一般格式为while (条件) 循环体语句 end其执行过程: 若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。 【例3.7】用while循环求1~100整数的和。sum=0; i=1; while i<=100 sum=sum+i; i=i+1; end sum运行结果sum= 5050 3. 循环的嵌套 如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。可以按照嵌套层数,分别叫作二重循环、三重循环等。处于内部的循环叫作内循环,处于外部的循环叫作外循环。在设计多重循环时,要特别注意内、外循环之间的关系,以及各语句放置的位置。 4. break语句和continue语句 break语句用来跳出循环体,结束整个循环。continue语句用来结束本次循环,接着进行下一次是否执行循环的判断。该语句一般与if语句配合使用。 在多重循环中,break语句只能使程序跳出包含它的最内层的那个循环。 【例3.8】求 [100,200]区间第一个能被33整除的整数。for n=100:200 if rem(n,33)~=0 continue end n break end运行结果为n= 132【思考】如果不用continue语句,只用break语句程序该如何修改? 实验与习题3 3.1输入一个3行2列的矩阵,求这个矩阵和它的转置的乘积。 3.2输入x,计算函数值y,x可以是标量,也可以是向量。y=1/2ex/3+x2sin(x)3.3输入k和t,计算乘积z=(t-1)(t-2)…(t-(k-1))(t-(k+1))…(t-7)。 3.4输入一个正整数n,求n以内的奇数和。 3.5产生一个4×4的整数矩阵,每个元素的值介于7~15,然后求主对角元素的和。 3.6根据以下程序段,下列()选项是错的。a=[1,2,3,4;5,6,7,8]; s=0 for n=a s=s+n; end sA. s(1)=10B. s(1,1)=10C. s(2,1)=6D. s(2)=26 3.7以下程序段输出的结果为()。a=[1 2 3]; b=[2 4 6]; try c=a.b; catch c=ab; end cA. 没有结果B. 28C. [3 6 9]D. [2 8 18]3.8执行以下程序后,x的值为()。a=[1 2 3;4 0 6; 2 1 5]; x=2; if a x=1; else x=0; end xA. 2B. 1C. 0D. a 3.9执行以下程序,命令窗口中输入9,则输出结果为()。a=input('input a'); b=sqrt(a); disp(['a=',num2str(a),' b=',num2str(b)])A. a=9 b=3B. 3C. 9D. [a=9 b=3] 3.10执行以下两句,在命令窗口输入abc,则输出为()。a=input('input a','s'); disp(['a=',a])A. abcB. aC. abc=a D. a=abc 3.11利用秦九韶算法计算多项式y=p1xn+p2xn-1+…+pnx+pn+1的值。 秦九韶算法例如,计算3x2+2x+1,当x=2时值为17。 y=(…((p1x+p2)x+p3)x+…+pn)x+pn+1%秦九韶算法求多项式的值 n=input('输入多项式次数n') str=['按降幂顺序输入',num2str(n+1),'个系数']; % num2str函数把数值转换为字符串。 p=(1)(str);%输入 x=input('输入x'); y=p(1); for i=2:n+1 y=(2); end (3)(['多项式值为',num2str(y)]) % 输出运行过程如下:输入多项式次数n 2 n= 2 按降幂顺序输入3个系数[3 2 1] 输入x 2 多项式值为17polyval3.12使用MATLAB函数求多项式3x2+2x+1,当x=2时的值。>> a=[3 2 1]; >>polyval(a,2)说明: polyval(a,2)就是求系数为a的多项式当x=2时的值。