Matlab 的判断与循环

                     

贡献者: 待更新

预备知识 Matlab 的变量与矩阵

1. 脚本文件

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

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

2. 判断结构

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

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 语句可用于在判断结构中产生多个分支,如

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 后面的命令。

3. 循环结构

   我们先来看 for 循环

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

   运行结果为

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

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 个矩阵元的平方。运行结果为

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

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

代码 1:fibonacci.m
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  2  3  5  8  13  21  34  55  89

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

代码 2:fibonacciOdd.m
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  3  5  13  21  55  89

4. return 命令

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


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

                     

© 小时科技 保留一切权利