1.2 MATLAB基本程序结构
按照现代程序设计的观点,任何算法功能都可以通过三种基本程序结构来实现,这三种结构是:顺序结构、选择结构和循环结构.其中顺序结构是最基本的结构,它依照语句的自然顺序逐条地执行程序的各条语句.如果要根据输入数据的实际情况进行逻辑判断,对不同的结果进行不同的处理,可以使用选择结构.如果需要反复执行某些程序段落,可以使用循环结构.
1.顺序结构
顺序结构由两个程序模块串接而成.一个程序模块是完成一项独立功能的逻辑单元,它可以是一段程序、一个函数、或者是一条语句.在顺序结构中,这两个程序模块是顺序执行的,即先执行<程序模块1>,再执行<程序模块2>.实现顺序结构的方法非常简单,只需将程序语句顺序排列即可.
2.选择结构
在MATLAB中,选择结构可由两种语句来实现.
(1)if语句
if语句的最简单用法为:
if表达式;
程序模块;
end
if语句的另一种用法为:
if 表达式
程序模块1
else
程序模块2
end
例1-1 使用if语句判断学生的成绩是否及格.
程序:
当针对多个条件进行选择时,可以采用下面的格式:
if 表达式1
程序模块1
elseif 表达式2
程序模块2
︙
elseif 表达式n
程序模块n
else
程序模块n+1
end
例1-2 将百分制的学生成绩转换为五等级制的成绩输出.
程序:
(2)switch语句
switch语句可以替代多分支的if语句,而且switch语句简洁明了,可读性更好.其格式为:
switch 表达式
case 数值1
程序模块1
case 数值2
程序模块2
︙
otherwise
程序模块n
end
其中的otherwise模块可以省略.
switch语句的执行过程是:首先计算表达式的值,然后将其结果与每一个case后面的数值依次进行比较,如果相等,则执行该case的程序模块;如果都不相等,则执行otherwise模块中的语句.
例1-3 用switch…case开关结构将百分制的学生成绩转换为五等级制的成绩输出.
程序:
3.循环结构
循环结构即可以多次重复执行某一组语句,是计算机解决问题的主要手段.在MATLAB中,循环结构可以用两种语句结构实现.
(1)for…end循环结构.其格式为:
fori=V,循环体结构,end其中V为一个行向量,循环变量i每次从V中取一个数值,执行一次循环体的内容,如此下去,直到完成V中的所有分量,就自动结束循环体的执行.
例1-4 计算s=12+22+52.
程序:
若循环结构里还包含循环结构,则构成多重循环.
例1-5 设计一个九九乘法表.
程序:
(2)while…end循环结构.其格式为:
while (表达式)
循环结构体
end
例1-6 求MATLAB的相对精度
解 解题的思路是,让y值不断减小,直到MATLAB分不出1+y与1的差别为止.
程序:
y=1;while 1+y>1; y1=y; y=y/2;end,y1
说明
①for循环与while循环的区别是,for语句的循环次数是确定的,而while语句的循环次数是不确定的;
②一定要注意在循环结构体内设置“修改条件表达式的语句”,以免进入“死循环”;
③一旦出现死循环,在命令窗用<ctrl+c>键可使程序中止;
④注意程序的可读性.
小提示:关于break、continue、return的用法.
当程序运行过程中出现return命令时,程序停止运行.break、continue用在循环语句中,在循环语句中,如果遇到break命令时,程序结束当前的“for”或“while”循环,转而执行它下面最近的end以下的语句;遇到continue时,跳过当次循环而继续下一次的循环.例如,原定要循环5次,但在进入第3次循环时遇到了continue,则第3次的循环被跳过,而继续进行第4次、第5次的循环,循环体实际上只重复执行了4次.
程序:
运行这个程序并观察运行结果.然后再将程序中的语句continue改为break或return,观察运行结果有何变化.
4.M-文件
M文件是包含MATLAB代码的文件,M文件按其内容和功能可分为脚本M文件和函数M文件两大类.
(1)脚本M文件
脚本M文件是许多MATLAB代码按顺序组成的命令集合,不接受参数的输入和输出,与MATLAB工作区共享变量空间.脚本文件一般用来实现一个相对独立的功能,比如对某个数据集进行某种分析、绘图,求解方程等.前面的几个例题都是脚本文件的类型.
(2)函数M文件
MATLAB的M-文件是由function语句引导的,其基本格式如下:
function[输出形参列表]=函数名(输入形参列表)
注释说明语句段,由%引导;
函数体语句
函数文件需要在M-文件编辑器中编写,写完以后按照当前的搜索路径保存,以后就可以随时调用这个函数了.
与脚本M文件不同的是调用函数M文件时需要输入自变量的实际值.
编程实例
例1-7 定义一个函数f(x)=[sin(x)]2,其中x以“度”为单位,然后再调用该函数.
解 在M-文件编辑器内写入下面的文件:
functiony=sinsd(x)
%自变量x以“度”为单位
a=x/180∗pi;
y=sin(a).^2;
将上面的文件保存之后即可随时调用.
命令
t=sinsd(45)
t=
0.5000
命令
help sinsd
命令
t=sinsd([45,60])
t=
0.5000 0.7500
表明该函数对元素群运算有效,上面的语句相当于
命令
x=[45,60];t=sinsd(x)
t=
0.5000 0.7500
命令
x=[45,60;30,90];f=sinsd(x)
f=
0.5000 0.7500
0.2500 1.0000
例1-8 在MATLAB中,一个函数可以调用其他函数,也可以调用其自身,即递归调用.下面利用递归算法编写一个函数,用来计算斐波那契(Fibonacci)数列的第k项.
斐波那契数列:
1,1,2,3,5,8,13,21,…
M-函数文件:
functiona=my_fibo(k)
ifk==1|k==2,a=1;
else,a=my_fibo(k-1)+my_fibo(k-2);end
将这个文件写入M文件编辑器并以名称“my_fibo.m”保存,以后就可以调用这个函数.
递归算法无疑是解决某一类问题的有效方法,但不宜滥用,因为它的运算速度往往很慢.
命令
tic,n=my_fibo(26),toc
n=
121393
elapsed_time=
34.4290
例1-9 可变输入变量个数的函数
MATLAB提供的conv()函数可用来求两个多项式的乘积.对于多个多项式的连乘,则不能直接使用此函数,需要用该函数嵌套使用,用起来很不方便.下面编写一个MATLAB函数,使它能直接处理任意多个多项式的乘积问题.
M-函数文件:
形参varargin是一个特殊的字符串,它把输入变量列表转换成一个元胞数组,每一个输入变量都是这个元胞数组的一个元素.下面调用这个函数,求解
d=(x4+2x3+4x2+5)(x+2)(x2+2x+3).
命令
p=[1,2,4,0,5];q=[1,2];f=[1,2,3];
d=convs(p,q,f)
d=
1 6 19 36 45 44 35 30
命令
convs(p,q,f,[1,1],[1,3],[1,1])
ans=
1 11 56 176 376 578 678 648 527 31590