|
|
教学辅导
第11讲 程序设计
MATLAB提供程序设计三种决策或控制流结构。它们是:For循环,While循环和If-Else-End结构。它们经常出现在M文件中,而不是直接加在MATLAB提示符下。
11.1 For 循环
For循环允许一组命令以固定的和预定的次数重复。For循环的一般形式是:
for x = array
{commands}
end
在for和end语句之间的{commands}按数组中的每一列执行一次。在每一次迭代中,x被指定为数组的下一列,即在第n次循环中,x=array(:,
n)。例如,
"for n=1:10
x(n)=sin(n*pi/10);
end
"x
x=
Columns 1 through 7
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090
Columns 8 through 10
0.5878 0.3090 0.0000
第一语句是:对n等于1到10,求所有语句的值,直至下一个end语句。第一次通过For循环n=1,第二次n=2,如此继续,直至n=10。在n=10以后,For循环结束,然后求end语句后面的任何命令值,在这种情况下显示所计算的x的元素。
For循环的其它重要方面是:
1.For循环不能用For循环内重新赋值循环变量n来终止。
"for n=1:10
x(n)=sin(n*pi/10);
n=10;
end
"x
x=
Columns 1 through 7
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090
Columns 8 through 10
0.5878 0.3090 0.0000
2.语句1:10是一个标准的MATLAB数组创建语句。在For循环内接受任何有效的MATLAB数组。
3. For循环可按需要嵌套。
for n=1:5
for m=5:-1:1
A(n,m)=n^2+m^2;
end
disp(n)
end
1
2
3
4
5
" A
A =
2 5 10 17 26
5 8 13 20 29
10 13 18 25 34
17 20 25 32 41
26 29 34 41 50
4. 当有一个等效的数组方法来解给定的问题时,应避免用For循环。例如,上面的第一个例子可被重写为
" n=1:10;
" x=sin(n*pi/10)
x =
Columns 1 through 7
0.3090 0.5878 0.8090 0.9511 1.0000 0.9511 0.8090
Columns 8 through 10
0.5878 0.3090 0.0000
两种方法得出同样的结果,而后者执行更快更直观,要求较少的输入。
5. 为得到最大速度,在For循环(While循环)被执行之前,应预先分配数组。例如,前面所考虑的第一种情况,在For循环内每执行一次命令,变量x的大小增加1。迫使MATLAB每通过一次循环要花费时间对x分配更多的内存。为了消去这个步骤,For循环的例子应重写为
"x=zeros(1,10); % preallocated memory for x
" for n=1:10
x(n)=sin(n*pi/10);
end
现在,只有x(n)的值需要改变。
11.2 While 循环
与For循环以固定次数求一组命令的值相反,While 循环以不定的次数求一组语句的值。While循环的一般形式是:
while expression
{commands}
end
只要在表达式里的所有元素为真,就执行while和end语句之间的{commands}。通常,表达式的求值给出一个标量值,但数组值也同样有效。在数组情况下,所得到数组的所有元素必须都为真。如下例:
"num=0;EPS=1;
"while (1+EPS)>1
EPS=EPS/2;
num=num+1;
end
"num
num =53
"EPS=2*EPS
EPS=2.2204e-016
该例表明计算特殊MATLAB值eps的一种方法,它是一个可加到1,而使结果以有限精度大于1的最小数值。这里我们用大写EPS,因此MATLAB的eps的值不会被覆盖掉。在这个例子里,EPS以1开始。只要(1+EPS)>1为真(非零),就一直求While循环内的命令值。由于EPS不断地被2除,EPS逐渐变小以致于EPS+1不大于1。(记住,发生这种情况是因为计算机使用固定数的数值来表示数。MATLAB用16位,因此,我们只能期望EPS接近10-16。)在这一点上,(1+EPS)>1是假(零),于是While循环结束。最后,EPS与2相乘,因为最后除2使EPS太小。
11.3 IF-ELSE-END 结构
在许多情况下,命令的序列必须根据关系的判断而有条件地执行。在编程语言里,这种逻辑由If-Else-End结构来提供。最简单的If-Else-End结构是:
if expression
{commands}
end
若在表达式中的所有元素为真(非零),则执行if和end语言之间的{commands}。在表达式包含有几个逻辑子表达式时,即使前一个子表达式决定了表达式的最后逻辑状态,仍要计算所有的子表达式。例如,
"apples=10; % number of apples
"cost=apples*25 % cost of apples
cost=250
"if apples>5 % give 20% discount for larger purchases
cost=(1-20/100)*cost;
end
"cost
cost=200
假如有两个选择,If-Else-End结构是:
if expression
commands evaluated if True
else
commands evaluated if False
end
在这里,如果表达式为真,则执行第一组命令;如果表达式是假,则执行第二组命令。
当有三个或更多的选择时,If-Else-End结构采用形式
if expression1
commands evaluated if expression1 is True
elseif expression2
commands evaluated if expression2 is True
elseif expression3
commands evaluated if expression3 is True
elseif expression4
commands evaluated if expression4 is True
elseif ……
.
.
.
else
commands evaluated if no other expression is True
end
最后的这种形式,只和所碰到的、与第一个真值表达式相关的命令被执行;接下来的关系表达式不检验,跳过其余的If-Else-End结构。而且,最后的else命令可有可无。
For循环和While循环的跳出或中断问题。例:
"EPS=1;
"for num=1:1000
EPS=EPS/2;
if (1+EPS)<=1
EPS=EPS*2
break
end
end
EPS=2.2204e-016
"num
num 53
这例演示了估算EPS的另一方法。在此情况下,For循环要执行足够多的次数。If-Else-End结构检验要看EPS是否变得足够小。如果是,EPS乘2,break命令强迫For循环提早结束,num=53。
在该例中,当执行break 语句时,MATLAB跳到循环外下一个语句。在现在情况下,它返回到MATLAB的提示符并显示EPS。如果一个break语句出现在一个嵌套的For循环或While循环结构里,那么MATLAB只跳出break所在的那个循环,不跳出整个嵌套结构。
MATLAB控制流结构小结如下表:
控 制 流 结 构
for x = array commandsend For循环,每一次迭代将x赋以数组的第i列,执行命令
while expression commandsend While循环,只要表达式的所有元素为真或非零,执行命令。
if expression commandsend 简单的If-Else-End结构,若在表达式中的所有元素是真值或非零,执行命令。
if expression commands evaluated if Trueelse expression commands evaluated
if Falseend 具有两条路径的If-Else-End结构,若表达式为真或非零,则执行一组命令。若表达式为假或零,则执行另一组命令。
if expression1commands evaluated if expression1 is Trueelseif expression2
commands evaluated if expression2 is Trueif expression3 commands evaluated
if expression3 is Trueelseif ……else commands evaluated if no other expression
is Trueend 最一般的If-Else-End结构。只执行与第一个真值表达式相关的命令。
break 结束For循环和While循环的执行
|