Skip to content

MATLAB - 循环

在编程中,循环(loop)是一种控制结构,它重复执行一段代码块,直到满足指定条件。循环对于自动化重复任务至关重要,例如处理数组中的元素或运行迭代算法。

循环的基本控制流程涉及条件检查。如果条件为真,循环体执行,然后再次检查条件。这会一直持续到条件变为假。

MATLAB 提供了两种主要的循环类型:for 和 while。

for 循环以固定的次数执行代码块。它遍历向量或矩阵的元素,在每次迭代中为循环变量分配新值。

for loopVariable = range
% 要执行的代码
end
% 创建一个数字向量
data = [10, 20, 30, 40, 50];
total = 0; % 初始化累加器
% 遍历 'data' 中的每个元素
for val = data
total = total + val;
end
fprintf('The sum is: %d\n', total);

while 循环重复执行一段代码块,只要指定条件保持为真。迭代次数不是预先确定的,而是取决于条件。

while condition
% 要执行的代码
% (必须包含能改变条件的代码)
end

示例:查找第一个大于 1000 的 2 的幂

Section titled “示例:查找第一个大于 1000 的 2 的幂”
n = 1;
while n < 1000
n = n * 2;
end
fprintf('The first power of 2 greater than 1000 is: %d\n', n);

你可以使用控制语句改变循环的流程:

  • break:立即终止整个循环,执行在 end 关键字之后的语句处继续。
  • continue:跳过当前迭代的其余部分,并继续循环的下一次迭代。

关键最佳实践:向量化和预分配

Section titled “关键最佳实践:向量化和预分配”

尽管循环是基础,但在 MATLAB 中过度使用它们会导致代码运行缓慢。MATLAB 针对**向量化(vectorized)**操作进行了优化,这些操作可以一次性作用于整个数组。在编写循环之前,请始终考虑是否存在向量化的替代方案。

让我们计算 1,000,000 个点的 $$y = \sin(x)$$。

x = linspace(0, 2*pi, 1e6);
% 慢速的 'for' 循环方法
tic; % 启动计时器
y_loop = zeros(1, 1e6);
for i = 1:length(x)
y_loop(i) = sin(x(i));
end
toc; % 结束计时器
% 快速向量化方法
tic; % 启动计时器
y_vec = sin(x);
toc; % 结束计时器
% 向量化方法快几个数量级。

如果循环不可避免,你必须为在循环内部增长的数组预分配(pre-allocate)内存。否则,MATLAB 将被迫在每次迭代中重新调整数组大小,这效率极低。

% 差:在循环中增长数组
tic;
bad_array = [];
for i = 1:50000
bad_array(i) = i^2;
end
toc;
% 好:使用 zeros() 预分配内存
tic;
good_array = zeros(1, 50000); % 一次性分配所有内存
for i = 1:50000
good_array(i) = i^2;
end
toc;
% 预分配方法明显更快。