MATLAB 学习笔记——4. 流程控制
在划分控制结构所对应的代码块时,编程语言通常采用如下三种做法:
- 基于大括号
{}
:例如C/C++,Java - 基于
end
标记:例如FORTRAN,MATLAB - 基于缩进:Python
MATLAB 受到 FORTRAN
的影响很大,也采用基于end
的代码块标记,并不使用大括号{}
来划分代码结构。
if 条件语句
提供例子即可
1 | if x>1 |
1 | if x>1 |
1 | if x>10 |
switch 条件语句
MATLAB支持基本的switch语句,我们可以判断表达式的值以进入不同的分支,不需要在分支结束使用break
,因为不会进入下一个分支,默认分支为otherwise
。MATLAB并不要求case
后面的结果是常量。
1 | switch x |
对于更复杂的switch情况,我们还可以使用下面的“反转”技巧,判断表达式取为true
,在case
中加入不同的布尔表达式
1
2
3
4
5
6
7
8
9
10
11
12
13
14score = 85;
switch true
case (score >= 90)
disp('Grade: A');
case (score >= 80)
disp('Grade: B');
case (score >= 70)
disp('Grade: C');
case (score >= 60)
disp('Grade: D');
otherwise
disp('Grade: F');
end
for 循环语句
非常不建议基于 for 循环(尤其是多重 for 循环)来遍历矩阵进行计算,因为这种做法的效率非常低下,不能照搬使用 C/C++ 时直接写 for 循环的习惯,使用 MATLAB 提供的向量化运算是更好的选择。
for
循环语句的标准格式如下 1
2
3for index = startValue:step:endValue
% 循环体代码
end
和其他编程语言通常采用的左闭右开区间不同,这里的索引区间实际上是闭区间
例如 1
2
3
4for i = 1:2:11
disp(i);
end
% 1 3 5 7 9 11
对于步长为1的情况,可以省略步长 1
2
3
4for i = 1:10
disp(i);
end
% 1 2 3 4 5 6 7 8 9 10
可以用双重循环来遍历一个矩阵 1
2
3
4
5
6B = [1, 2;3, 4];
for i = 1:size(B, 1)
for j = 1:size(B, 2)
disp(B(i, j));
end
end
和其他语言一样,在循环中支持如下选项:
break
跳出当前循环;continue
跳转进入下一次循环。
注意:
- 关于循环指标:由于
i,j
默认是虚数单位,如果将其作为循环变量,虽然在语法上不会报错,但是这会修改它们的值,后续不能将其用作虚数单位。(可以使用i=1i, j=1j
来恢复) - 如果不使用向量化的语法,那么大规模的 for 循环(尤其是多层循环)很可能就是可行计算程序的性能瓶颈,需要特别注意循环体内部的语句细节,这里不做讨论。
for 遍历语句
我们可以用下面的语法方便地遍历行向量中的每一项
1 | A = [1 2 3]; |
对于矩阵,遍历语句每次会获取一列
1 | A = [1 2 3 |
输出 1
2
3
4
5
6
7
81
4
2
5
3
6
while 循环语句
while循环没什么好说的,和其他语言没什么区别,例如
1 | w=0;u=0; |
同样也支持break
和continue
语句。
补充
上述结构可以随意嵌套,例如
1 | for c = 1:ncols |
在单条语句的简单情况下,也可以使用单行形式,例如 1
2
3
4
5
6
7
8
9
10% if 条件, 语句; end
if a > 0, disp('a is positive'); end
if ~isempty(TitleStr), title(TitleStr); end
% if 条件, 语句1; else 语句2; end
if x > 0, disp('Positive'); else disp('Non-positive'); end
% for 变量 = 范围, 语句; end
for i = 1:5, fprintf('%d ', i); end