概述
上次内容,我们介绍了 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 条件下执行的一段代码。
1 | if 逻辑条件 |
if 语句还可以加入两个关键字: else 和 elseif 。
else 就是补充 if 判断为 false 的情况。
1 | if 逻辑条件 |
elseif 是针对嵌套使用 if 语句使用的,在分支较多时优化结构
1 | if 逻辑条件 1 |
if 语句实例
1 | % if 语句 |
测试结果
1 | 样例 1 |
if 语句注意的问题
1.首先是判断条件:判断条件如果是等式,请务必记得等式是用 ‘==’ 连接的。
2.使用嵌套 if 语句时,会形成 else if 应当与 elseif 区分开。
3.使用嵌套 if 语句时,判断条件之间的相互关系很复杂,应当仔细区分开。
4.如果你觉得2,3很麻烦,请无脑使用 elseif
5.用 elseif 连接的各个分支条件都是越来越宽松,对于多分支条件结构能很好简化。
switch 语句
switch 语句需要提供一个变量,针对这个变量可能的值进行选择分支的语句。也就是查这个变量是什么可能值,如果找到了这个值则运行对应命令。特别的,switch 语句只能对离散值生效(case 数量有限),并且每一个 case 都必须不同(否则只执行第一个 case ,并且会给出警告),在给出的下列案例中,尽管用 if 语句理论上也可以实现同等效果,但是 switch 语句的可读性更好。
switch 语句实例
1 | % switch 语句 |
测试结果
1 | 工作日 3 |
循环结构
循环结构也分为两种:for 循环和 while 循环。循环结构的目的显而易见:重复多次地执行同一段代码。
for 循环用于按次数循环,循环次数为指定的向量长度。
while 循环用于按条件循环,只要逻辑变量为 true 则重复循环。
for 循环
for 循环用于特定的次数的循环,最大特点是只要达到次数就会停止。
for 使用的格式为:for + 空格 + 索引向量 开头,end 结尾,中间为应循环的一段代码。
1 | for 索引 = 索引向量 |
for 循环样例
1 | % 样例 1 |
测试结果
1 | 样例 1 |
while 循环
while 循环用于特定条件下的循环,最大特点是只要出现一次 false 就会停止。
while 循环使用的格式为:while + 空格 + 逻辑条件 开头,end 结尾,中间行为循环的代码。
1 | while 逻辑条件 |
while 循环样例
1 | % 样例 1 |
测试结果
1 | 样例 1 |
循环的补充
关于循环还用到另外两个关键字: continue 和 break 。
这两个关键字作用很像但有很大区别:
continue :放弃当前这一次循环,开始下一次循环(循环次数 +1)
break :放弃当前这一层循环,循环直接终止。
下面来看看这两个关键字的应用:
continue, break
1 | % 用循环观察输出 |
测试输出
1 | 1 |
循环应该注意的问题
1.每一个 for 循环理论上都可以使用 while 循环实现(在 while 循环添加索引,以索引作为判断条件),实际上这样处理是没有什么意义的,反而会使代码更加晦涩,我们只需要根据需要使用对应的方法即可。
2.for 循环需要使用索引向量,请尽可能保证你每次使用的循环索引变量名都不同(嵌套循环中必须不同,否则内层循环无法识别,会出现意想不到的错误)。控制变量名不同的好处在于,容易区分每一步循环的意义,并且容易使用查找替换修改。
3.使用 while 循环不注意就可能写出死循环,比如判断条件为 A 大于 B ,然而 A-B 却不断增大。
4.对于复杂的循环结构,可以使用 continue 和 break 实现简化。
5.对于 MATLAB 而言,很多操作使用循环会大大降低运算速度,比如创建很大的零矩阵500×500×500,使用矩阵操作和内置函数能大大提高效率。
小结
本节过后,理论上很多问题可以用 MATLAB 来解决了。条件和循环结构也会用于许多实际问题,读者在掌握两种结构的时候也应该注意使用者两种结构可能导致的问题。其中一些问题若没有注意到,可能会导致难以发现的异常,会给自己带来不少麻烦。