标签: MATLAB
概述
上次内容,我们介绍了 MATLAB 中逻辑类型(logical)的变量,这种变量只有两种值: true 和 false。本次介绍的内容是 MATLAB 的一些语法结构包括我们最常用的条件结构和循环结构。条件结构是根据程序的执行结果选择应当执行的命令。循环结构是根据程序重复执行一系列语句的结构。两种结构都是程序结构的基础内容。从这一章开始,所有问题都可以得到理论上的解决了。
变量名
我们之前介绍过变量在使用的时候,可以直接使用诸如 “ a = 1 ” 的方式直接赋值,也特地提到过一些特殊的参数值(如 pi, inf, NaN, i, j)不应当作为变量名使用。那么使用变量名到底有哪些应该注意的点:
A. 严格规定的变量名的格式:(一定不能做的事,做了会报错的情况)
1.MATLAB 变量名必须以字母开头
2.可以使用的字符为字母,下划线和数字
3.长度不能过大,31个字符是最大长度。
4.字符是区分大小写的。
5.不能使用系统预留的关键字(可以使用 iskeyword 命令查看关键字列表)。
B. 理想的变量名格式:(推荐做的事)
1.MATLAB 变量名最好是有意义容易理解的名称如: success_rate
2.尽管不能在变量名中使用空格,可以用下划线代替空格连接单词来表达变量意义。
3.没有特殊需要时,尽量使用小写字母( A 和 a 是不同的变量)
4.不要重复使用已经使用过的变量名,尽管你之后不再需要使用这个变量。
条件结构
条件结构的特点是程序会根据不同条件选择不同的执行命令。MATLAB 中条件结构有两种: if 语句和 switch 语句,其中 if 语句是我们最常见的一种用法。
if 语句
if 语句是根据一个逻辑值加以判断一个语句是否运行的语句,能对逻辑值进行判断,并在该逻辑值为 true 时执行对应的语句。(在上一次内容中我们讲到,一个逻辑值可以是一个数,一个逻辑命题甚至一串复合的逻辑表达式,在这里也适用)。
if 语句的标准格式就是:if + 空格 + 逻辑条件 开头,end 结尾,中间行 true 条件下执行的一段代码。
if 逻辑条件
true 条件下的代码段;
end
if 语句还可以加入两个关键字: else 和 elseif 。
else 就是补充 if 判断为 false 的情况。
if 逻辑条件
true 条件下的代码段;
else
false 条件下的代码段;
end
elseif 是针对嵌套使用 if 语句使用的,在分支较多时优化结构
if 逻辑条件 1
条件 1 为 true 代码段;
elseif 逻辑条件 2
条件 1 为 false 且条件 2 为 true 代码段;
...
elseif 逻辑条件k
先前所有条件为 false ,条件 k 为 true 代码段;
end
if 语句实例
% if 语句
% 样例 1
disp('样例 1 ')
% if 语句仅在逻辑值为 true 是执行对应的命令
a = 1;
b = 2;
if b > a
disp('statement 1');
end
if b > a
disp('statement 2');
end
% 样例 2
disp('样例 2 ')
% if 语句可以使用 else 作为判断条件的补集
% 也就是说,若为 false 则运行。
a = 3;
b = 2;
if b > a
disp('statement 3');
else
disp('statement 4');
end
% 样例 3
disp('样例 3 ')
% if 语句可以嵌套使用,在 if 语句中使用 if 语句
a = 3;
if a < 2
disp('statement 5');
else % 此处可以不必换行
if a < 5
disp('statement 6');
else
disp('statement 7');
end
end
% 样例 4
disp('样例 4 ')
% 观察到样例 3 在区间数量多的时候要嵌套很多次
% 因此可以使用另一个关键字 elseif 简化。
% 以下代码与样例 3 是等价的
a = 3;
if a < 2
disp('statement 5');
elseif a < 5
disp('statement 6');
else
disp('statement 7');
end
% 样例5
disp('样例 5 ')
% elseif 连接的分支条件关系越来越宽松,可以从排分数实例来看
score = 67;
if score == 100
disp('满分');
elseif score > 90
disp('优秀');
elseif score > 80
disp('良好');
elseif score > 70
disp('中');
elseif score > 60
disp('及格');
else
disp('不及格');
end
% 每一级条件都是下一级条件的子集,条件越来越宽松。
测试结果
样例 1
statement 1
statement 2
样例 2
statement 4
样例 3
statement 6
样例 4
statement 6
样例 5
及格
if 语句注意的问题
1.首先是判断条件:判断条件如果是等式,请务必记得等式是用 ‘==’ 连接的。
2.使用嵌套 if 语句时,会形成 else if 应当与 elseif 区分开。
3.使用嵌套 if 语句时,判断条件之间的相互关系很复杂,应当仔细区分开。
4.如果你觉得2,3很麻烦,请无脑使用 elseif
5.用 elseif 连接的各个分支条件都是越来越宽松,对于多分支条件结构能很好简化。
switch 语句
switch 语句需要提供一个变量,针对这个变量可能的值进行选择分支的语句。也就是查这个变量是什么可能值,如果找到了这个值则运行对应命令。特别的,switch 语句只能对离散值生效(case 数量有限),并且每一个 case 都必须不同(否则只执行第一个 case ,并且会给出警告),在给出的下列案例中,尽管用 if 语句理论上也可以实现同等效果,但是 switch 语句的可读性更好。
switch 语句实例
% switch 语句
% 计算机会这样操作:
% 1.开始查询以下的 case 是否有刚好等于 str 的值
% 2.若有刚好等于 str 的值,则执行对应命令
% 3.若没有,则执行 otherwise 对应命令
% 4.若连 otherwise 也没有,则 switch 语句结束,不做任何事。
str = '周三';
switch str
case '周一'
disp('工作日 1');
case '周二'
disp('工作日 2');
case '周三'
disp('工作日 3');
case '周四'
disp('工作日 4');
case '周五'
disp('工作日 5');
otherwise
disp('休息');
end
测试结果
工作日 3
循环结构
循环结构也分为两种:for 循环和 while 循环。循环结构的目的显而易见:重复多次地执行同一段代码。
for 循环用于按次数循环,循环次数为指定的向量长度。
while 循环用于按条件循环,只要逻辑变量为 true 则重复循环。
for 循环
for 循环用于特定的次数的循环,最大特点是只要达到次数就会停止。
for 使用的格式为:for + 空格 + 索引向量 开头,end 结尾,中间为应循环的一段代码。
for 索引 = 索引向量
循环的代码段
end
for 循环样例
% 样例 1
disp('样例 1 ')
% 这个样例说明循环次数取决于你指定向量的长度
a = 0;
%
for index_1 = 2:10
a = a + 1;
end
disp(a);
% 样例 2
disp('样例 2 ')
% 循环中使用索引(index_2)时
% 每次index_2的值为指定的索引向量对应当前循环次数的值。
b = 0;
%
for index_2 = 2:10
b = b + index_2;
end
disp(b);
% 样例 3
disp('样例 3 ')
% 循环也可以嵌套,但需要使用不同的循环索引
c = zeros(5,5);
for index_3 = 1:5
for index_4 = 1:5
c(index_3,index_4) = sqrt(index_3^2 + index_4^2);
end
end
disp(c);
测试结果
样例 1
9
样例 2
54
样例 3
1.4142 2.2361 3.1623 4.1231 5.0990
2.2361 2.8284 3.6056 4.4721 5.3852
3.1623 3.6056 4.2426 5.0000 5.8310
4.1231 4.4721 5.0000 5.6569 6.4031
5.0990 5.3852 5.8310 6.4031 7.0711
while 循环
while 循环用于特定条件下的循环,最大特点是只要出现一次 false 就会停止。
while 循环使用的格式为:while + 空格 + 逻辑条件 开头,end 结尾,中间行为循环的代码。
while 逻辑条件
循环的代码段
end
while 循环样例
% 样例 1
disp('样例 1 ')
% 求解 1+2+3+...+k>100的最小整数解
k = 0;
sum = 0;
while sum <= 100
sum = sum + k;
k = k + 1;
end
disp(k);
% 样例 2
disp('样例 2 ')
% 用泰勒级数逼近自然底数exp(1),将相对误差控制在10^-4内
k = 0;
sum = 0;
while abs((sum-exp(1))/exp(1)) > 1e-4
sum = sum + 1/factorial(k);
k = k + 1;
end
disp(sum);
% 样例 3
disp('样例 3 ')
% 最简单的死循环: 判断条件永远成立。
% 可以用 Ctrl + C 强制中断运行。
while 1
;
end
测试结果
样例 1
15
样例 2
2.7181
循环的补充
关于循环还用到另外两个关键字: continue 和 break 。
这两个关键字作用很像但有很大区别:
continue :放弃当前这一次循环,开始下一次循环(循环次数 +1)
break :放弃当前这一层循环,循环直接终止。
下面来看看这两个关键字的应用:
continue, break
% 用循环观察输出
% 当 index == 3 时,执行 continue ,跳过了 3 而到 4;
% 当 index == 5 时,执行 break ,循环直接终止,5 6 7都没有执行;
for index = 1 : 7
if index == 3
continue;
end
if index == 5
break;
end
disp(index);
end
测试输出
1
2
4
循环应该注意的问题
1.每一个 for 循环理论上都可以使用 while 循环实现(在 while 循环添加索引,以索引作为判断条件),实际上这样处理是没有什么意义的,反而会使代码更加晦涩,我们只需要根据需要使用对应的方法即可。
2.for 循环需要使用索引向量,请尽可能保证你每次使用的循环索引变量名都不同(嵌套循环中必须不同,否则内层循环无法识别,会出现意想不到的错误)。控制变量名不同的好处在于,容易区分每一步循环的意义,并且容易使用查找替换修改。
3.使用 while 循环不注意就可能写出死循环,比如判断条件为 A 大于 B ,然而 A-B 却不断增大。
4.对于复杂的循环结构,可以使用 continue 和 break 实现简化。
5.对于 MATLAB 而言,很多操作使用循环会大大降低运算速度,比如创建很大的零矩阵500×500×500,使用矩阵操作和内置函数能大大提高效率。
小结
本节过后,理论上很多问题可以用 MATLAB 来解决了。条件和循环结构也会用于许多实际问题,读者在掌握两种结构的时候也应该注意使用者两种结构可能导致的问题。其中一些问题若没有注意到,可能会导致难以发现的异常,会给自己带来不少麻烦。