MATLAB程序流程控制-循环结构
MATLAB提供了两种实现循环结构的语句:for语句和while语句。
一、for语句
一般情况下,对于事先能确定循环次数的循环结构,使用for语句是比较方便的。for语句的格式如下:
for 循环变量=表达式1:表达式2:表达式3
循环体语句
end
其中,“表达式1:表达式2:表达式3”是一个冒号表达式,将产生一个行向量,3个表达式分别代表初值、步长和终值。步长为1时,表达式2可以省略。
关于for语句的执行过程还要说明以下几点。
(1)for语句针对向量的每一个元素执行一次循环体,循环的次数就是向量中元素的个数,也可以针对任意向量。
for k=[1,3,2,5]
k
end
(2)可以在for循环体中修改循环变量的值,但当程序执行流程再次回到循环开始时,就会自动被设成向量的下一个元素。
for k=[1,3,2,5]
k
k=20
end
(3)for语句中的3个表达式只在循环开始时计算一次,也就是说,向量元素一旦确定将不会再改变。如果在表达式中含有变量,即便在循环体中改变变量的值,向量的元素也不改变。
n=2;
for k=1:2:n+8
n=5;
k
end
(4)退出循环之后,循环变量的值就是向量中最后的元素值。
for k=1:2:10
end
k
(5)当向量为空时,循环体一次也不执行。
for k=1:-2:10
k
end
例4-7 输出100~999全部水仙花数。
shu=[]; %用于存放结果,先赋空值
for m=100:999
m1=fix(m/100); %求m的百位数字
m2=rem(fix(m/10),10); %求m的十位数字
m3=rem(m,10); %求m的个位数字
if m==m1*m1*m1+m2*m2*m2+m3*m3*m3
shu=[shu,m]; %存入结果
end
end
disp(shu)
rem函数:取余数
例1 已知
y
=
1
+
1
2
2
+
1
3
2
+
.
.
.
+
1
n
2
y=1+\frac{1}{2^2}+\frac{1}{3^2}+...+\frac{1}{n^2}
y=1+221+321+...+n21
,当n=100时,求y的值。
y=0;
n=100;
for i=1:n
y=y+1/(i*i);
end
y
例2 设,求s=。
程序一:
a=0;
b=3*pi;
n=1000;
h=(b-a)/n;
x=a;
s=0;
f0=exp(-0.5*x)*sin(x+pi/6);
for i=1:n
x=x+h; %下一个x坐标
f1=exp(-0.5*x)*sin(x+pi/6); %求新的函数值
s=s+(f0+f1)*h/2; %求小梯形面积并累加
f0=f1; %更新函数值
end
s
程序二:
a=0;
b=3*pi;
n=1000;
h=(b-a)/n;
x=a:h:b; %生成自变量向量x
f=exp(-0.5*x).*sin(x+pi/6); %求函数值向量f
for i=1:n
s(i)= (f(i)+f(i+1))*h/2; %求各个小梯形面积,组成面积向量s
end
s=sum(s) %求面积向量s元素之和
在上述例子中,for语句的循环变量都是标量,这与其他高级语言的相关循环语句(如FORTRAN语言中的DO语句,C语言中的for语句等)等价。
按照MATLAB的定义,for语句的循环变量可以是一个列向量。for语句更一般的格式如下:★★
for 循环变量=矩阵表达式
循环体语句
end
例3 写出下列程序的执行结果。★★
s=0;
a=[12,13,14;15,16,17;18,19,20;21,22,23];
for k=a
s=s+k;
end
disp(s')
该程序的功能是求矩阵各行元素之和,运行结果如下:
39 48 57 66
执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直至各列元素处理完毕。实际上,行向量可以被看作仅为一行的矩阵,每列是单个数据,所以本节一开始给出的for语句格式是一种特例。
二、while语句
while语句就是通过判断循环条件是否满足来决定是否继续循环的一种循环控制语句,也称为条件循环语句。它的特点是先判断循环条件,条件满足时执行循环。while语句的一般格式如下:
while 条件
循环体语句
end
例4 从键盘输入若干个数,当输入0时结束输入,求这些数的平均值和它们之和。
sum=0;
n=0;
x=input('Enter a number (end in 0):');
while x~=0
sum=sum+x;
n=n+1;
x=input('Enter a number (end in 0):');
end
if n>0
sum
mean=sum/n
end
例5 根据矩阵指数的幂级数展开式求矩阵指数。
X=input('Enter X:');
E=zeros(size(X)); %生成与x同样大小的零矩阵
F=eye(size(X)); %生成与x同样大小的单位矩阵
n=1;
while norm(F,1)>0
E=E+F; %实现累加
F=F*X/n; %求累加项
n=n+1;
end
E
expm(X) %调用MATLAB矩阵指数函数求矩阵指数
三、break语句和continue语句
与循环结构相关的语句还有break语句和continue语句,它们一般与if语句配合使用。
break语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。
continue语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。
例6 求[100,200]之间第一个能被21整除的整数。
for n=100:200
if rem(n,21)~=0
continue
end
n
break
end
4.循环的嵌套
如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。实现多重循环结构仍用前面介绍的循环语句。因为任一循环语句的循环体部分都可以包含另一个循环语句,这种循环语句的嵌套为实现多重循环提供了方便。
多重循环的嵌套层数可以是任意的,可以按照嵌套层数,分别叫做二重循环、三重循环等。处于内部的循环叫做内循环,处于外部的循环叫做外循环。
在设计多重循环时,要特别注意内、外循环之间的关系,以及各语句放置的位置。
例7 若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求[1,500]之间的全部完数。
for m=1:500
s=0;
for k=1:m/2
if rem(m,k)==0
s=s+k;
end
end
if m==s
disp(m)
end
end
例8 用筛选法求某自然数范围内的全部素数。
m=input('m=');
p=1:m;
p(1)=0;
for i=2:sqrt(m)
for j=2*i:i:m
p(j)=0;
end
end
n=find(p~=0);
p(n)
更为简洁的程序:
m=input('m=');
p=2:m;
for i=2:sqrt(m)
n=find(rem(p,i)==0 & p~=i);
p(n)=[];
end
p
例9 用筛选法求某自然数范围内的全部素数。
m=input('m=');
p=1:m;
p(1)=0;
for i=2:sqrt(m)
for j=2*i:i:m
p(j)=0;
end
end
n=find(p~=0);
p(n)
更为简洁的程序:
m=input('m=');
p=2:m;
for i=2:sqrt(m)
n=find(rem(p,i)==0 & p~=i);
p(n)=[];
end
p
Matlab学习笔记内容来源于《MATLAB程序设计与应用 第三版》刘卫国主编