MATLAB知识点:for循环的七道经典例题

 ​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​

MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili


节选自​第4章: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时,下面式子的结果:

y\left( n \right) \,\,=\,\,1+\frac{1}{2^2}+\frac{1}{3^2}+\cdots +\frac{1}{n^2}

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))))