本节书摘来自异步社区《MATLAB图像处理375例》一书中的第1章,第1.8节,作者:MATLAB技术联盟著,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.8 MATLAB程序流程控制结构
MATLAB图像处理375例
作为计算机语言,编程是必需的,编程靠的是程序控制语句。计算机语言程序控制模式主要有三大类:顺序结构、选择结构和循环结构。这一点MATLAB与其他编程语言完全一致。
1.8.1 顺序结构
顺序结构是指所有组成程序源代码的语句按照由上至下的次序依次执行,直到程序的最后一个语句。这种程序的优点是容易编制;缺点是结构单一,能够实现的功能有限。
在MATLAB语言的函数中,变量主要有输入变量、输出变量及函数内所使用的变量。
(1)数据输入。
从键盘输入数据,可以使用input函数来进行,该函数的调用格式为:
A=input(提示信息,选项);
其中提示信息为一个字符串,用于提示用户输入什么样的数据。
如果在input函数调用时采用's'选项,则允许用户输入一个字符串。例如,想输入一个人的姓名,可采用命令:
xm=input('hello world','s');
(2)数据输出。
MATLAB提供的命令窗口输出函数主要有disp函数,其调用格式为:
disp(输出项)
其中输出项既可以为字符串,也可以为矩阵。
【例1-64】数据输出示例。
A='MATLAB';
disp(A)
运行结果如下:
MATLAB
【例1-65】输入x,y的值,并将它们的值互换后输出。
x=input('Input x.');
y=input('Input y.');
z=x;
x=y;
y=z;
disp(x);
disp(y);
运行结果如下:
Input x.1
Input y.2
2
1
【例1-66】对任一自然数n,按如下法则进行运算:若n为偶数,则将n除2;若n为奇数,则将n乘2加1。将运算结果按上面法则继续运算,重复若干次后计算结果最终是1。
n=input('input n='); %输入数据
while n~=1
r=rem(n,2); %求n/2的余数
if r ==0
n=n/2 %第一种操作
else
n=2*n+1 %第二种操作
end
end
运行结果如下:
input n=5
n =
32
n =
16
n =
8
n =
4
n =
2
n =
1
(3)程序的暂停。
暂停程序的执行可以使用pause函数,其调用格式为:
pause(延迟秒数)
如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。若要强行中止程序的运行,则可使用Ctrl+C命令。
1.8.2 选择结构
在MATLAB中,选择结构依照不同的判断条件进行判断,然后根据判断的结果选择某一种方法来解决某一个问题。
在MATLAB中,if语句有3种格式。
(1)单分支if语句。
if 条件
语句组
end
当条件成立时,则执行语句组,执行完之后继续执行if语句的后继语句,若条件不成立,则直接执行if语句的后继语句。
(2)条件判断语句也是程序设计语言中流程控制语句之一。使用该语句,可以选择执行指定的命令,MATLAB语言中的条件判断语句是if-else-end语句。
双分支if语句:
if 条件
语句组1
else
语句组2
end
当条件成立时,执行语句组1,否则执行语句组2,语句组1或语句组2执行后,再执行if语句的后继语句。
在程序设计中,也经常碰到需要进行多重逻辑选择的问题,这时可以采用if-else-end语句的嵌套形式:
if〈逻辑判断语句1〉
逻辑值1为“真”时的执行语句
elseif〈逻辑判断语句2〉
逻辑值2为“真”时的执行语句
elseif〈逻辑判断语句3〉
……
else
当以上所有的逻辑值均为假时的执行语句
end
(3)多分支if语句。
if 条件1
语句组1
elseif 条件2
语句组2
……
elseif 条件m
语句组m
else
语句组n
end
用于实现多分支选择结构。
(4)if-else-end语句所对应的是多重判断选择,而有时也会遇到多分支判断选择的问题。MATLAB语言为解决多分支判断选择提供了switch-case语句。
switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式为:
switch 表达式
case 表达式1
语句组1
case 表达式2
语句组2
……
case 表达式m
语句组m
otherwise
语句组n
end
与其他的程序设计语言的switch-case语句不同的是,在MATLAB语言中,当其中一个case语句后的条件为真时,switch-case语句不对其后的case语句进行判断,也就是说在MATLAB语言中,即使有多条case判断语句为真,也只执行所遇到的第一条为真的语句。这样就不必像C语言那样,在每条case语句后加上break语句以防止继续执行后面为真的case条件语句。
【例1-67】计算分段函数的值。
程序如下:
x=input('请输入x的值:');
if x<=0
y= (x+sqrt(pi))/exp(2)
else
y=sin(x+sqrt(1+x*x))/2
end
运行结果如下:
请输入x的值:1
y =
0.3325
【例1-68】输入三角形的三条边,求面积。
程序如下:
A=input('请输入三角形的三条边:');
if A(1)+A(2)>A(3) & A(1)+A(3)>A(2) & A(2)+A(3)>A(1)
p=(A(1)+A(2)+A(3))/2;
s=sqrt(p*(p-A(1))*(p-A(2))*(p-A(3)));
disp(s);
else
disp('不能构成一个三角形。')
end
运行结果如下:
请输入三角形的三条边:[6 8 10]
24
请输入三角形的三条边:[1 1 2]
不能构成一个三角形。
【例1-69】输入一个字符,若为大写字母,则输出其后继字符,若为小写字母,则输出其前导字符,若为其他字符则原样输出。
程序如下:
E=input('','s');
If E>='A' & E<='Z'
disp(setstr(abs(E)+1));
elseif E>='a'& E<='z'
disp(setstr(abs(E)-1));
else
disp(c);
end
运行结果如下:
A
B
b
a
a
`
*
*
【例1-70】switch语句示例。
程序如下:
a=input('a=?');
switch a
case 1
disp('a=1');
case {2,3,4}
disp('a=2or3or4');
case 5
disp('a=5');
otherwise
disp('other value');
end;
运行结果如下:
a=?3
a=2or3or4
a=?6
other value
1.8.3 循环结构
在MATLAB中,循环结构就是在程序中某一条语句或多条语句重复多次的运行。
在MATLAB中,包含两种循环结构:循环次数不确定的while循环,循环次数确定的for循环。这两种不完全相同,各有特色。
(1)for循环结构。
for循环语句是流程控制语句中的基础,使用该循环语句可以以指定的次数重复执行循环体内的语句,其格式为:
for 循环变量=表达式1:表达式2:表达式3
循环体语句
end
其中,表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略。
(2)while循环结构。
while语句可以实现“当”型的循环结构,格式为:
while(表达式)
MATLAB语句
end
其中,循环判断语句为某种形式的逻辑判断表达式,当该表达式的值为真时,就执行循环体内的语句;当表达式的逻辑值为假时,就退出当前的循环体。
在while循环语句中,必须有可以修改循环控制变量的命令,否则该循环语言将陷入死循环,除非循环语句中有控制退出循环的命令,如break语句、continue命令。当程序流程运行至该命令时,不论循环控制变量是否满足循环判断语句均将退出当前循环,执行循环后的其他语句。
【例1-71】水仙花数是指一个n位数(n≥3),它每个位上的数字的n次幂之和等于它本身。输出全部水仙花数。
程序如下:
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
disp(m)
end
end
运行结果如下:
153
370
371
407
【例1-72】输入若干个数,当输入0时结束输入,求这些数的平均值和它们的和。
程序如下:
sum=0;
n=0;
val=input('请输入数字 (输入0结束):');
while (val~=0)
sum=sum+val;
n=n+1;
val=input('请输入数字 (输入0结束):');
end
if (n > 0)
sum
mean=sum/n
end
运行结果如下:
请输入数字 (输入0结束):1
请输入数字 (输入0结束):2
请输入数字 (输入0结束):3
请输入数字 (输入0结束):4
请输入数字 (输入0结束):5
请输入数字 (输入0结束):0
sum =
15
mean =
3
1.8.4 程序流程控制语句及其他常用命令
1.break命令
在MATLAB中,break命令通常用于for或while循环语句中,与if语句一起使用,中止本次循环,跳出最内层循环。
【例1-73】break命令示例。
a=5;b=8;
for i=1:4
b=b+1;
if i>2
break %当if条件满足时不再执行循环
end
a=a+2
end
运行结果如下:
a =
7
a =
9
2.continue命令
通常用于for或while循环语句中,与if语句一起使用,达到跳过本次循环,去执行下一轮循环的目的。
【例1-74】continue命令示例。
a=5;b=8;
for i=1:4
b=b+1;
if i<2
continue %当if条件满足时不再执行后面语句
end
a=a+2 %当i<2时不执行该语句
end
运行结果如下:
a =
7
a =
9
a =
11
3.try指令
try语句是MATLAB特有的语句,先试探性地执行语句1,如果出错,就将错误信息存入系统保留变量lasterr中;然后再执行语句2,如果不出错,就转向执行end后面的语句。此语句可以提高程序的容错能力,增加编程的灵活性。该指令的一般结构是:
try
语句1
catch
语句2
end
【例1-75】已知某图像文件,但不知其存储格式为.bmp还是.jpg,试编程正确读取该图像文件。
try
picture=imread('tire.bmp','bmp');
filename='tire.bmp';
catch
picture=imread('tire.tif','tif');
filename='tire. tif ';
end
filename
运行结果如下:
filename
filename =
tire.bmp
【例1-76】先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。
A=magic(2); B=[7,8;10,11];
try
C=A*B;
catch
C=A.*B;
end
C
lasterr %显示出错原因
运行结果如下:
C =
37 41
48 54
ans =
SWITCH 表达式必须为标量或字符串常量