贡献者: 待更新
在讲解更复杂的程序结构前,我们先来看脚本文件。脚本(script)文件 是包含若干个指令的文件,文件后缀名为 “.m”。脚本文件可以单独执行,也在其他文件或 Command Window 中被调用(注意需要将所在文件夹添加到搜索路径)。后者相当于把被调用脚本的代码直接插入到调用指令处,调用指令就是脚本文件的文件名。脚本中的每条命令后面应该加分号以隐藏输出结果,若需要输出,用 disp
函数。
>> disp('good'); a = 3; disp(['a = ', num2str(a)])
good
a = 3
在脚本文件中,可以在行首或命令后用百分号 %
进行注释(comment)1。注释是程序的说明,使程序更易读,但在执行程序时会被忽略(图 1 )。
现在来看一段代码(脚本文件)。要生成新的脚本文件,可以在 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
函数随机生成一个从 0
到 1
的数,如果随机数大于 0.5
则输出第一段文字,否则输出第二段文字。不难猜测出这里的 if
用于判断,如果条件满足,则只执行 if
和 else
之间的指令。如果条件不满足,则只执行 else
到 end
的指令。注意 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
后面的命令。
我们先来看 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}$)。
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 以内的斐波那契数列的所有奇数项
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 行的 break
在 a3 > 100
时就会使程序跳出循环。如果 a3 <= 100
且为偶数,则第 10 行的 elseif
判断为真,continue
命令被执行,程序将直接跳过之后的 disp
函数直接进入下一个循环,所以数列的偶数项都不会被输出。程序的运行结果为(每个数占一行)
1 1 3 5 13 21 55 89
在一个脚本文件的任何地方,如果 return
命令被执行,则程序将结束该脚本文件的执行。如果该脚本文件是被单独执行的,程序将终止。如果该脚本文件是被其他脚本文件或函数文件调用的,程序将继续执行调用命令的下一个命令。
1. ^ 截止到 Matlab 2017b,在英文版 Matlab IDE 中,任何中文注释都会在 Matlab 重启后变为乱码。若要使用中文注释,建议使用中文操作系统和中文 Matlab。