本节书摘来自异步社区出版社《MATLAB图像处理超级学习手册》一书中的第2章,第2.9节,作者:MATLAB技术联盟 , 张岩 更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.9 MATLAB程序设计
MATLAB图像处理超级学习手册
在MATLAB中,提供了很多程序流程控制语句,如数据的输入输出、顺序结构、判断语句、分支语句、循环语句以及其他流程控制函数。
2.9.1 数据的输入和输出
MATLAB中提供的用于数据输入和输出的函数分别为input函数和disp函数,下面将对其进行介绍。
1.数据的输入
在MATLAB中,input函数用于实现数据的输入,该函数的调用格式为:
A=input (提示信息,选项)
其中,提示信息是一个字符串,用于提示用户输入什么样的数据。
A=input('A= ')
如果在input函数调用时采用's'选项,则允许用户输入一个字符串。例如,想输入一个人的姓名,可采用如下命令:
question = input ('What's your name?', 's')
2.数据的输出
在MATLAB中,disp函数用于实现数据的输出,该函数的调用格式为:
disp(输出项)
其中输出项既可以为字符串,也可以为矩阵。
当用disp函数显示矩阵时,将不显示矩阵的名字,而且其格式更紧密,且不留任何没有意义的空行。
【例2-26】求一元二次方程ax2+bx+c=0的根。
a=input('a=');
b=input('b=');
c=input('c=');
d=b*b-4*a*c;
x=[(-b+sqrt(d))/(2*a), (-b-sqrt(d))/(2*a)]
disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);
2.9.2 顺序结构
顺序结构是最简单的程序结构,系统在编译程序时,按照程序的物理位置顺序执行。这种程序的优点是容易编制,缺点是结构单一、能够实现的功能有限。例如:
>>r=1;
h=1;
s=2*r*pi*h + 2*pi*r^2;
v=pi*r^2*h;
disp('The surface area of the colume is:'),disp(s);
disp('The volume of the colume is:'),disp(v);
运行结果如下:
The surface area of the colume is:
12.5664
The volume of the colume is:
3.1416
2.9.3 判断语句
在MATLAB中,判断语句可以使程序中的一段代码只在满足一定条件时才执行。if与else或elseif连用,偏向于是非选择,当某个逻辑条件满足时执行if后的语句,否则执行else语句。
1.结构为if…end
当程序只有一个判断语句时,可以选择if…end结构,此时程序结构为:
if 表达式
执行程序块
end
只有一个判断语句,其中的表达式为逻辑表达式,当表达式为真时,执行相应的语句,否则,直接跳到下一段语句。语句中的end是决不可少的,没有它,在逻辑表达式为0时,就找不到继续执行程序的入口。
【例2-27】判断输入的两个参数a和b是否都大于0,是则返回“a和b都大于0”,否则不返回,程序最后返回“否”。
>>a=input('a=');
b=input('b=');
if a > 0 & b>0
disp(' a和b都大于0');
end
disp('否');
2.结构为if…else…end
当程序有两个选择时,可以选择 if…else…end 结构, 此时程序结构为:
if 表达式
执行程序块1
else
执行程序块2
end
当判断表达式为真时,执行程序块1,否则执行程序块2。
【例2-28】判断输入的两个参数a和b是否都大于0,是则返回“a和b都大于0”,如果不全大于0,则显示“a和b不全都大于0”。
>>a=input('a=');
b=input('b=');
if a > 0 & b>0
disp(' a和b都大于0');
else
disp(' a和b不全都大于0');
end
下面的例子为分段函数值的计算。
>>x=input('请输入x的值:');
if x<=0
y= (x+sqrt(pi))/exp(3);
else
y=log(x+sqrt(1+x*x))/3;
end
3.结构为if…elseif…else…end
当程序的判断包含多个选择时,可以采用if…elseif…else…end结构,此时程序结构为:
if 表达式1
执行程序块1
elseif 表达式2
执行程序块2
elseif ...
...
...
else
执行程序块
end
其中,可以包含任意多个 elseif 语句。
【例2-29】判断输入学生成绩的所属等级:60以下不合格,60~70中等,70~89良好,90以上优秀。
>>n=input('input the score:')
if n>=0 & n<60
A='不合格'
elseif n>=60 & n<70
A='中等'
elseif n>=70 & n<89
A='良好'
elseif n>=90 &n<100
A='优秀'
else
A='输入错误'
end
2.9.4 分支语句
在MATLAB 中,还提供了的另一种多选择语句,即分支语句。分支语句的结构为:
switch 分支语句
case 条件语句
执行程序块
case {条件语句1, 条件语句2, 条件语句3, ...}
执行程序块
otherwise
执行程序块
end
其中,分支语句为一个变量(数值或者字符串变量),如果该变量的值与某一条件相符,则执行相应的语句,否则,执行 otherwise 后面的语句。在每一个条件中,可以包含一个条件语句,也可以包含多个条件,当包含多个条件时,以单元数组的形式表示条件。
【例2-30】任意底的对数的实现。
>>A=input('底');
B=input('对数值');
switch a
case exp(1)
y = log(B);
case 2
y = log2(B);
case 10
y = log10(B);
otherwise
y = log(B)/log(A);
end
【例2-31】某商场对顾客所购买的商品实行打折销售,标准为:小于200(没有折扣),200~500(5%折扣),500~1 000(8%折扣),1 000~2 500(15%折扣),2 500~5 000(20%折扣),大于等于5 000(25%折扣)。输入所售商品的价格,求其实际销售价格。
>>p=input('输入商品价格');
switch fix(p/100)
case {0,1} %小于200
r=0;
case {2,3,4} %200 ~500
r=5/100;
case num2cell(5:9) % 500~1 000
r=8/100;
case num2cell(10:24) % 1 000~2 500
r=15/100;
case num2cell(25:49) % 2 500~5 000
r=20/100;
otherwise %大于等于5 000
r=25/100;
end
p=p*(1-r) %输出商品实际销售价格
2.9.5 for循环语句
在MATLAB中,for语句调用的基本格式如下:
for index=初值:增量:终值
语句组A
end
其中,A为循环体。
此语句表示把语句组A反复执行N次。循环次数N(需要预先指定)为:N=1+(终值-初值)/增量。在每次执行时程序中的index的值按“增量”增加。
【例2-32】用循环求解 1+2+…+99+100。
>>s=0;
for k=1:100
s=s+k;
end
>>s=0;
for k=1:100
s=s+1/2^(k+2);
end
2.9.6 for语句的嵌套
for语句的嵌套也称为循环的嵌套,或称为多重循环结构,是指一个循环结构的循环体又包括一个循环结构。
【例2-33】建立一个100阶数组,数组中的每一个元素A(k, n)满足A(k, n)=1/(k+n-1)。
>>for k=1:100
for n=1:100
A(k, n)=1/(k+n-1);
end
end
2.9.7 while循环语句
在MATLAB中,while 语句用于将相同的程序块执行多次(次数不需要预先指定),当条件表达式为真时,执行程序块,直到条件表达式为假。
while 语句的结构为:
while 表达式
执行程序块
end
【例2-34】用循环求解最小的m,使其满足sumlimits_{i = 1}^m {i > 100} 。
>>s=0;
m=0;
while (s<=100)
m=m+1;
s=s+m;
end