Skip to content

MATLAB - 嵌套循环

MATLAB,像其他编程语言一样,允许您将一个循环放置在另一个循环内部。这被称为嵌套循环。这种结构对于迭代多维数组中的元素或需要对外层过程的每一步重复操作的算法非常有用。

然而,编写高效 MATLAB 代码的一项关键技能是知道何时用向量化替换循环。本教程将涵盖这两个概念。

其语法涉及将一个循环结构完全放置在另一个循环结构内部。

for outer_index = 1:m
% 外层循环的代码运行 m 次
for inner_index = 1:k
% 内层循环的代码在外层循环的每次迭代中运行 k 次
% 总语句运行次数 = m * k 次
<statements>;
end
end
while <expression1>
% 外层循环代码
while <expression2>
% 内层循环代码
<statements>;
end
end

让我们使用嵌套 for 循环来查找素数。如果一个数只能被 1 和它本身整除,那么它就是素数。我们的算法将检查每个数 i 从 2 到 i 的平方根之间的因子 j。

% 一个查找 1 到 100 之间素数的改进算法
max_num = 100;
fprintf('Prime numbers between 1 and %d:\n', max_num);
for i = 2:max_num
is_prime = true; % 初始假定该数字是素数
% 内层循环只需检查到 sqrt(i) 的因子。
% 这是一个关键的性能优化。
for j = 2:sqrt(i)
% mod(i, j) == 0 表示 j 是 i 的一个因子。
if mod(i, j) == 0
is_prime = false; % 找到因子,所以它不是素数
break; % 提前退出内层循环,无需进一步检查
end
end
if is_prime
fprintf('%d ', i);
}
fprintf('\n'); % 在末尾打印一个换行符
% 预期输出:
% Prime numbers between 1 and 100:
% 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

在 MATLAB 中,循环可能很慢,因为每次迭代都会被解释执行。向量化是将基于循环、面向标量的代码重写为使用 MATLAB 的矩阵和向量操作的过程。向量化代码更简洁、更具可读性,并且通常执行速度快得多。

考虑创建一个 5x5 的乘法表。嵌套循环是直观的方法:

% --- 嵌套循环方法(慢)---
tic; % 启动计时器
N = 1000;
mult_table_loop = zeros(N, N);
for row = 1:N
for col = 1:N
mult_table_loop(row, col) = row * col;
end
end
toc; % 结束计时器

向量化方法使用数组乘法在单行代码中实现相同的结果,并且速度快几个数量级。

% --- 向量化方法(快)---
tic; % 启动计时器
N = 1000;
col_vector = (1:N)'; % 创建一个列向量
row_vector = 1:N; % 创建一个行向量
mult_table_vec = col_vector * row_vector; % 外积
toc; % 结束计时器
% 在典型的机器上,输出可能是:
% Elapsed time is 0.021567 seconds. (对于循环)
% Elapsed time is 0.000789 seconds. (对于向量化代码)
  • 使用向量化(尽可能时):用于对数组所有元素的操作、数学计算、逻辑索引和数据筛选。始终首先尝试寻找向量化解决方案。
  • 使用循环:当元素的计算依赖于前一次迭代的结果时(例如,迭代求解器、斐波那契数列)。当您需要根据难以向量化的复杂条件进行 break 或 continue 时也很有用。

对于许多常见问题,MATLAB 已提供了高度优化、内置的函数。对于查找素数,您应该使用 isprime。

max_num = 100;
% 创建一个要测试的数字向量
numbers = 1:max_num;
% isprime 函数返回一个逻辑数组(0 和 1)
prime_flags = isprime(numbers);
% 使用逻辑索引仅选择素数
primes = numbers(prime_flags)
% 预期输出:
% primes =
% 2 3 5 7 11 13 17 19 ... (等等)

这展示了理想的 MATLAB 工作流程:以对整个数组进行操作的思维方式思考,并尽可能利用内置函数。