# 条件结构
# if-elseif-else-end
语句
用法:
if 条件1 | |
代码块 | |
elseif 条件2 | |
代码块 | |
else | |
代码块 | |
end |
注意:
`elseif` 关键字不能加空格,与 C/C++ 等语言不同。
使用 if 语句时, `if` 和 `end` 两个关键字任何时候都不能省略!
其余的用法与 C/C++
都相同。首先判断 if
后的条件,若不符合再盘导演 elseif
后的条件。若仍然不符合,直接执行 else
后的语句。 若没有 else
关键字,直接退出 if
语句。
if
后条件也支持其他运算,如算术运算等。其值可以为一个数值常数,不是必须是逻辑值 0
和 1
。这里与逻辑表达式的结果相同。参见:MATLAB 学习笔记 4 - 逻辑运算
如果条件表达式是一个矩阵或向量,会报错,除非矩阵中全为非零值或全为零值,才会表示有效的值(可以看成 对矩阵使用 all
函数)。
如果想表示有一个非零元素就为逻辑 1
,要先把矩阵拉成向量(使用线性索引),再进行一次 any
; 或者直接对该矩阵执行两次 any
函数。
当然,MATLAB 中 if
语句是可以嵌套使用的。
# switch-case-otherwise-end
语句
用法:
switch 开关表达式 | |
case 表达式 1 | |
语句 1 | |
case 表达式 2 | |
语句 2 | |
…… | |
…… | |
case 表达式 n | |
语句 n | |
otherwise | |
语句 n+1 | |
end |
同样的, switch
和 end
两个关键字不能省略。
开关表达式必须是一个数值标量或者一个字符向量 / 字符串,不能是向量或矩阵。
只有开关表达式与某个 case
后的表达式相等时,对应的语句才会执行。
可以被 if
语句替代。
# 循环结构
# for-end
语句 (for 循环)
用于已知循环次数的情形,语法如下:
for 循环变量 = 向量或矩阵 | |
循环体 | |
end |
同样的, for
和 end
两个关键字不能省略。
可以嵌套。
循环变量:用于迭代的变量名,它会在每次迭代中从矩阵或向量中取出一列的值。数值向量或者矩阵则表示了循环变量可以取值的范围。一旦循环变量遍历完数值向量或矩阵中的所有值,循环即结束。
for i=1:5 | |
disp(i); | |
end |
输出:
1
2
3
4
5
A=randi([-3,3],2,4); | |
disp(A); % 打印 A | |
for i=A | |
i % 语句后不加分号表示在命令行窗口显示该语句执行结果。 | |
end |
运行结果:可以发现 for 循环遍历了 A
矩阵的每一列
3 -2 3 2
3 3 0 -3
i =
3
3
i =
-2
3
i =
3
0
i =
2
-3
# while-end
语句 (while 循环)
允许在不知道具体循环次数的情况下进行循环。
用法:
while 循环表达式 | |
循环体 | |
end |
当循环表达式为真(逻辑值 1 )时则执行循环,直到循环表达式不为真推出循环。
可以嵌套。
同样的, while
和 end
两个关键字不能省略。
求斐波那契数列第一个大于 99999 的项是第几项。
f(1)=1; | |
f(2)=1; | |
n=2; | |
while f(n)<99999 | |
f(n+1)=f(n)+f(n-1); | |
n=n+1; | |
end | |
disp(n); |
运行结果:
26
其中 f
是一个向量, n
是索引变量(相当于 C/C++
的下标)。
while 循环,有无限循环的可能!
如果写代码时不小心写了一个无限循环,要强行终止循环,请按下 Ctrl + C
。
# 循环控制关键字 continue
和 break
continue 进行下一次循环,break 直接退出整个循环,常常配合 if
语句使用。
当在嵌套的循环中使用,这两个关键字会对调用它们的循环体对应的循环进行控制,而对其余的循环体无影响。
for i=1:5 | |
for j=2:6 | |
disp(i); | |
disp(j); | |
if(j%i==0) | |
break; % 仅使内层循环停止,而不影响外层循环。 | |
end | |
end | |
end |