图

Matlab 的判断与循环

预备知识 Matlab 的变量与矩阵

脚本文件

   在讲解更复杂的程序结构前,我们先来看脚本文件.脚本(script)文件 是包含若干个指令的文件,文件后缀名为 “.m”.脚本文件可以单独执行,也在其他文件或 Command Window 中被调用(注意需要将所在文件夹添加到搜索路径). 后者相当于把被调用脚本的代码直接插入到调用指令处,调用指令就是脚本文件的文件名.脚本中的每条命令后面应该加分号以隐藏输出结果,若需要输出,用 disp 函数.

1
2
3
>> disp('good'); a = 3; disp(['a = ', num2str(a)])
good
a = 3
在脚本文件中,可以在行首或命令后用百分号 % 进行注释(comment)1.注释是程序的说明,使程序更易读,但在执行程序时会被忽略(图 1 ).

判断结构

   现在来看一段代码(脚本文件). 要生成新的脚本文件, 可以在 Editor 菜单(图 1 ) 的左边单击 New, 然后选 Script, 或者用快捷键 Ctrl+N. 在生成的 Editor 中输入以下代码

1
2
3
4
5
6
a = rand(1,1); b = 0.5;
if a > b % a 较大
    disp('a is larger');
else % b 较大
    disp('b is larger');
end

   这段程序用 rand 函数随机生成一个从 01 的数,如果随机数大于 0.5 则输出第一段文字,否则输出第二段文字. 不难猜测出这里的 if 用于判断,如果条件满足,则只执行 ifelse 之间的指令.如果条件不满足,则只执行 elseend 的指令. 注意 else 语句可以不在判断结构中出现, 若不出现, 当判断条件不满足时程序将直接执行 end 后面的代码.

   要执行该代码, 在 Editor 菜单中单击 Run 图标(绿色三角形), 如果代码没有保存, Matlab 会先弹出保存对话框. 再次强调文件必须保存在 Matlab 的搜索路径下.

   elseif 语句可用于在判断结构中产生多个分支, 如

1
2
3
4
5
6
7
8
9
10
a = rand(1,1);
if a > 0.9
    disp('a in (0.9, 1]');
elseif a > 0.6
    disp('a in (0.6, 0.9]');
elseif a > 0.3
    disp('a in (0.3, 0.6]');
else
    disp('a in [0, 0.3]');
end

   这个程序用于判断随机数 a 的区间. 若 if 的条件判断成功, 判断结构就只执行 if 到第一个 elseif 之间的命令. 若 if 判断失败, 程序就继续判断第一个 elseif 中的条件, 若判断成功, 就只执行第一个 elseif 到第二个 elseif 之间的命令, 以此类推. 如果 if 和所有的 elseif 条件都判断失败, 则执行 else 后面的命令.

循环结构

   我们先来看 for 循环

1
2
3
for ii = 1:3
    disp(['ii^2 = ' num2str(ii^2)]);
end

   运行结果为

1
2
3
ii^2 = 1
ii^2 = 4
ii^2 = 9
容易看出这段代码被执行了 3 次,循环变量 ii 按顺序取 1:3 中的一个矩阵元.注意选取 ii 作为变量名是为了与虚数单位区分,当然也可以选择其他变量名.再来看一个稍复杂的循环

1
2
3
4
5
6
7
Nx = 5;
x = zeros(1,Nx);  % 预赋值
x(1) = 2;
for ii = 2:numel(x)
    x(ii) = x(ii-1)^2;
end
disp(['x = ' num2str(x)])

   在循环开始前 x(1) 被赋值为 2,在循环中,第 ii 个矩阵元 依次被赋值为第 ii-1 个矩阵元的平方.运行结果为

1
x = 2  4  16  256  65536
注意在循环前用 zero 对矩阵进行了预赋值(preallocation).预赋值不是必须的,但如果不进行预赋值,每次循环矩阵的尺寸都要改变,会导致程序运行变慢.另外注意循环中不允许给循环变量赋值.

   再来看另一种循环叫做 while 循环. 下面来看一个例程, 输出 100 以内的斐波那契数列($a_1 = 1, a_2 = 1, a_{n+1} = a_{n} + a_{n-1}$).

  fibonacci.m

1
2
3
4
5
6
7
8
9
a1 = 1; disp(a1); 
a2 = 1; disp(a2);
a3 = a1 + a2;
while a3 <= 100
    disp(a3);
    a1 = a2;
    a2 = a3;
    a3 = a1 + a2;
end

   while 结构在每个循环开始会判断 while 后面的条件, 如果条件成立, 则进行一次循环, 否则退出循环. 以上的程序中由于我们事先并不知道我们要进行几次循环, 所以选用 while, 当最后一项大于 100 时, 循环终止. 运行结果为(每个数占一行):

1
1  1  2  3  5  8  13  21  34  55  89

   在 for 循环或 while 循环的内部, 使用 continue 命令可以直接进入下一个循环(while 的仍然要先判断条件), 使用 break 命令可以跳出循环. 以下例程计算 100 以内的斐波那契数列的所有奇数项

  fibonacciOdd.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
a1 = 1; a2 = 1;
disp(a1); disp(a2);
a3 = a1 + a2;
while 1
    a1 = a2;
    a2 = a3;
    a3 = a1 + a2;
    if a3 > 100
        break;
    elseif mod(a3, 2) == 0
        continue;
    end
    disp(a3);
end

   先来看第 4 行, double 类型的非零数在这里会自动转换为 logical 类型的 1 (true), 只有 double 类型的 0 才会转换为 logical 类型的 0 (false). 乍看之下, while 循环将永远执行下去(称为死循环), 然而第 9 行的 breaka3 > 100 时就会使程序跳出循环. 如果 a3 <= 100 且为偶数, 则第 10 行的 elseif 判断为真, continue 命令被执行, 程序将直接跳过之后的 disp 函数直接进入下一个循环, 所以数列的偶数项都不会被输出. 程序的运行结果为(每个数占一行)

1
1  1  3  5  13  21  55  89

return 命令

   在一个脚本文件的任何地方, 如果 return 命令被执行, 则程序将结束该脚本文件的执行. 如果该脚本文件是被单独执行的, 程序将终止. 如果该脚本文件是被其他脚本文件或函数文件调用的, 程序将继续执行调用命令的下一个命令.


1. 截止到 Matlab 2017b, 在英文版 Matlab IDE 中, 任何中文注释都会在 Matlab 重启后变为乱码. 若要使用中文注释, 建议使用中文操作系统和中文 Matlab.

致读者: 小时物理百科一直以来坚持所有内容免费且不做广告,这导致我们处于日渐严重的亏损状态。长此以往很可能会最终导致我们不得不选择商业化,例如大量广告,内容付费,会员制,甚至被收购。因此,我们鼓起勇气在此请求广大读者热心捐款,使网站得以健康发展。如果看到这条信息的每位读者能慷慨捐助 10 元,我们几天内就能脱离亏损状态,并保证网站能在接下来的一整年里向所有读者继续免费提供优质内容。感谢您的支持。
—— 小时(项目创始人)

编辑词条 返回目录 返回主页 捐助项目 © 小时物理百科 保留一切权利