循环语句的基本思想就是重复,通过反复执行某些语句,来满足重复计算的要求。在编写 MATLAB 程序时,循环是一项非常重要且常用的技术,它允许我们有效地执行相同或类似的操作多次,而不必每次都手动重复相同的代码。
在本节中,我们将深入探讨两种主要的循环语句:for-end 语句和 while-end 语句。这两种循环语句能够以不同的方式控制循环的次数,以及在何时终止循环。其中,for-end语句用于事先已知循环次数的情形,如果在循环开始之前,我们已经知道了循环的次数,那么我们通常使用for-end 语句;而 while-end 语句则更适合在循环的次数未知的情况下使用。
for-end语句(简称for循环)用于事先已知循环次数的情形,其语法如下:
在该语法中,循环变量是用于迭代的变量名,它会在每次循环迭代中从向量或矩阵中取出一列的值。数值向量或者矩阵则表示了循环变量可以取值的范围,通常根据实际需要事先给定。一旦循环变量遍历完数值向量或者矩阵中的所有值,循环就会结束。
下面我们来看几个简单的例子:
x = 1:5;
for ii = x
ii
end
% 第二行可以直接写成:
% for ii = 1:5
% for循环一定以end结束,别漏写了!
x = [3;5;9;8];
for ii = x
ii
end
% for和end所在的行的最后面什么都不用写,不需要添加冒号或者分号
% 循环遍历矩阵的每一列,这种情况在实际编程中用的较少
x = [1 5 8;
3 6 9;
4 7 2;
6 5 3];
for ii = x
ii
end
%通常我们将循环体的开头增加缩进,这样看起来更美观。你可以选中代码,然后智能缩进,快捷键“ctrl+i”。
通过上面三个例子可以看出,一旦给定具体的数值向量或者矩阵,for循环的次数就固定了,取决于向量或者矩阵中有多少列。
下面我们来看for循环的例子(一定要看讲解视频,会介绍MATLAB的断点调试功能)。
(1)不使用sum函数,计算行向量x中所有元素的和。
x = [5 8 9 1 4 3 7];
s = 0; % 初始化最终的求和结果为0
for ii = x
s = s + ii;
end
disp(s)
在这个示例中,for 循环遍历了向量 x 中的每个元素,将它们逐个加到变量 s 中,最终得到了所有元素的和。
思考:如果x是一个列向量,左侧的代码输出的s是什么,应该如何修改代码?
(2)计算当n等于100时,下面式子的结果:
n = 100; % 设置n的值
y = 0; % 初始化y的值为0
for k = 1:n
% 计算每一项并累加到y中
y = y + 1 / (k^2);
end
disp(y)
在这个示例中,for 循环从 1 到 n 遍历每个整数 k,并计算每一项 1 / (k^2),然后将它们累加到变量 y 中。最终,y 的值将是整个表达式的结果。
思考:使用上一章的知识点,如何通过一行代码直接计算y的值?
参考答案: y = sum(1./(1:100).^2)
(3)计算当n从1一直取到100时,上一小问式子的计算结果,并将计算结果保存到一个长度为100的行向量S中(S中第i个元素表示y(i)的结果)。
S = zeros(1, 100);
for n = 1:100
y = 0; % 初始化y的值为0
for k = 1:n
y = y + 1 / (k^2);
end
S(n) = y;
end
disp(S)
这里使用了循环的嵌套,上一问的代码可用来求出任意一个具体的n对应的y。因此,这一问我们只需要使用循环让n从1遍历到100,并将每次的计算结果保存到向量S中。
请大家思考:(1)y = 0;这行代码能否放在循环的外面? (2)能否优化上面的代码,使得通过一次循环就得到S。
这两个问题留作本章最后的课后习题。
(4)计算从公元1年到公元9999年间,有多少个闰年。闰年的判读条件是年份能够被4整除,但不能被100整除,或者年份能够被400整除。
% 初始化闰年计数器
leap_year_count = 0;
% 循环遍历从公元1年到公元9999年的每一年
for year = 1:9999
% 检查是否为闰年的条件
if (mod(year, 4) == 0 && mod(year, 100) ~= 0) || (mod(year, 400) == 0)
% 如果是闰年,增加计数器
leap_year_count = leap_year_count + 1;
end
end
disp(leap_year_count)
(5)一个三位正整数各位数字的立方和等于该数本身则称该数为水仙花数,例如:1^3 + 5^3+ 3^3 = 153,则153是水仙花数。请你找出所有的水仙花数并将其保存到向量S中。
% 初始化存储水仙花数的向量S为空
S = [];
% 循环遍历所有的三位整数
for num = 100:999
% 拆解数字
digit1 = floor(num / 100); % 百位
digit2 = floor(mod(num, 100) / 10); % 十位
digit3 = mod(num, 10); % 个位
% 检查是否为水仙花数的条件
if num == digit1^3 + digit2^3 + digit3^3
S = [S, num]; % 若是水仙花数,则添加到向量S中
end
end
% 显示所有的水仙花数
disp(S)
(6)斐波那契数列的递推公式为
求F(30).
n = 30;
F = ones(1,n); % 初始化用来保存中间计算结果的向量全为1
for k = 3:n
F(k) = F(k-1) + F(k-2);
end
Fn = F(n)
% 832040
(7)生成一个5行8列的矩阵,矩阵中每个元素都是在区间[1, 10]上取值的随机整数。接下来请循环每一列,若发现同一列的五个元素各不相同,则保留该列;若该列中有重复的元素则删除该列。
% 生成随机整数矩阵
matrix = randi([1, 10], 5, 8);
% 输出生成的随机整数矩阵
disp(matrix)
% 初始化新矩阵,用于存储五个元素各不相同的列
new_matrix = [];
% 循环遍历每一列
for column = matrix
% 使用unique函数取当前列的唯一值
unique_column = unique(column);
% 若取完唯一值后还是5个元素,则添加到新矩阵中
if length(unique_column) == 5
new_matrix = [new_matrix, column];
end
end
disp(new_matrix) % 显示新矩阵的结果
思考题:你能不使用循环语句求解这个问题吗?
参考答案:
matrix(:,all(diff(sort(matrix))))
在使用for循环时,需要注意以下事项:
(1)若for语句后面的向量或者矩阵为空,则循环一次也不会被执行。
for ii = 2:1
x = 10;
disp(x)
end
% MATLAB什么都不会输出
for ii = []
x = 10;
disp(x)
end
% MATLAB什么都不会输出
(2)for语句后面的向量或者矩阵只会在循环开始时使用一次,向量或者矩阵元素一旦确定将不会再改变。即使你在循环体中改变向量或者矩阵的值,循环变量的值也不改变。
x = 1:4;
for ii = x
x = [0 0 0 0];
disp(ii)
end
disp(x)
(3)可以在循环体中修改循环变量的值,但当程序执行流程再次回到循环开始时,循环变量会自动恢复成向量或者矩阵的下一列元素。
for ii = 1:3
disp(ii)
ii = 10;
disp(ii)
end
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删