循环语句 #

一、for循环 #

1.1 基本语法 #

matlab
for variable = start:step:end
    % 循环体
end

1.2 基本示例 #

matlab
% 遍历1到5
for i = 1:5
    disp(i);
end

% 使用步长
for i = 1:2:10
    disp(i);  % 1, 3, 5, 7, 9
end

% 递减
for i = 10:-1:1
    disp(i);
end

1.3 遍历数组 #

matlab
% 遍历向量
v = [10 20 30 40 50];
for i = 1:length(v)
    fprintf('v(%d) = %d\n', i, v(i));
end

% 直接遍历元素
for val = v
    disp(val);
end

% 遍历矩阵
A = [1 2 3; 4 5 6; 7 8 9];
for i = 1:size(A, 1)
    for j = 1:size(A, 2)
        fprintf('A(%d,%d) = %d\n', i, j, A(i,j));
    end
end

1.4 遍历元胞数组 #

matlab
names = {'张三', '李四', '王五'};

% 使用索引
for i = 1:length(names)
    fprintf('姓名: %s\n', names{i});
end

% 直接遍历
for name = names
    fprintf('姓名: %s\n', name{1});
end

1.5 遍历结构体数组 #

matlab
students(1).name = '张三';
students(1).age = 20;
students(2).name = '李四';
students(2).age = 22;

for i = 1:length(students)
    fprintf('%s: %d岁\n', students(i).name, students(i).age);
end

二、while循环 #

2.1 基本语法 #

matlab
while condition
    % 循环体
end

2.2 基本示例 #

matlab
% 计数循环
i = 1;
while i <= 5
    disp(i);
    i = i + 1;
end

% 条件循环
sum = 0;
i = 1;
while sum < 100
    sum = sum + i;
    i = i + 1;
end
fprintf('sum = %d, i = %d\n', sum, i-1);

2.3 收敛循环 #

matlab
% 牛顿法求平方根
x = 10;  % 求√10
guess = x / 2;
tolerance = 1e-10;
max_iter = 100;
iter = 0;

while abs(guess^2 - x) > tolerance && iter < max_iter
    guess = (guess + x/guess) / 2;
    iter = iter + 1;
end

fprintf('√%.0f ≈ %.10f (迭代%d次)\n', x, guess, iter);

2.4 输入验证循环 #

matlab
% 验证用户输入
valid = false;
while ~valid
    answer = input('请输入1-10之间的数字: ');
    if answer >= 1 && answer <= 10
        valid = true;
    else
        disp('输入无效,请重新输入');
    end
end
fprintf('你输入了: %d\n', answer);

三、循环控制 #

3.1 break语句 #

matlab
% 找到第一个满足条件的元素
data = [10 25 30 45 50];
for i = 1:length(data)
    if data(i) > 40
        fprintf('找到大于40的元素: data(%d) = %d\n', i, data(i));
        break;
    end
end

% while循环中使用break
i = 1;
while true
    if i > 10
        break;
    end
    disp(i);
    i = i + 1;
end

3.2 continue语句 #

matlab
% 跳过偶数
for i = 1:10
    if mod(i, 2) == 0
        continue;
    end
    disp(i);  % 只输出奇数
end

% 处理数据跳过无效值
data = [1, NaN, 3, NaN, 5];
sum = 0;
for i = 1:length(data)
    if isnan(data(i))
        continue;
    end
    sum = sum + data(i);
end
fprintf('有效数据之和: %d\n', sum);

3.3 return语句 #

matlab
function result = find_first_negative(data)
    for i = 1:length(data)
        if data(i) < 0
            result = i;
            return;  % 直接返回函数
        end
    end
    result = -1;  % 未找到
end

四、嵌套循环 #

4.1 基本嵌套 #

matlab
% 打印乘法表
for i = 1:9
    for j = 1:i
        fprintf('%d×%d=%d\t', j, i, i*j);
    end
    fprintf('\n');
end

4.2 矩阵操作 #

matlab
% 矩阵转置
A = [1 2 3; 4 5 6];
[m, n] = size(A);
B = zeros(n, m);

for i = 1:m
    for j = 1:n
        B(j, i) = A(i, j);
    end
end

% 或者直接使用
B = A';

4.3 循环标签(模拟) #

matlab
% MATLAB没有标签,使用标志变量
found = false;
for i = 1:10
    for j = 1:10
        if i + j == 15
            fprintf('找到: i=%d, j=%d\n', i, j);
            found = true;
            break;
        end
    end
    if found
        break;
    end
end

五、向量化替代 #

5.1 避免循环 #

matlab
% 不推荐:使用循环
n = 1000000;
result = zeros(1, n);
for i = 1:n
    result(i) = sin(i);
end

% 推荐:向量化
result = sin(1:n);

5.2 预分配数组 #

matlab
% 不推荐:动态扩展
result = [];
for i = 1:10000
    result = [result, i^2];
end

% 推荐:预分配
result = zeros(1, 10000);
for i = 1:10000
    result(i) = i^2;
end

% 最佳:向量化
result = (1:10000).^2;

六、实用示例 #

6.1 斐波那契数列 #

matlab
n = 10;
fib = zeros(1, n);
fib(1) = 1;
fib(2) = 1;

for i = 3:n
    fib(i) = fib(i-1) + fib(i-2);
end

disp(fib);

6.2 冒泡排序 #

matlab
function arr = bubble_sort(arr)
    n = length(arr);
    for i = 1:n-1
        for j = 1:n-i
            if arr(j) > arr(j+1)
                temp = arr(j);
                arr(j) = arr(j+1);
                arr(j+1) = temp;
            end
        end
    end
end

6.3 数值积分 #

matlab
% 梯形法数值积分
function I = trapezoid(f, a, b, n)
    h = (b - a) / n;
    x = linspace(a, b, n+1);
    y = f(x);
    
    I = h * (y(1) + y(end)) / 2;
    for i = 2:n
        I = I + h * y(i);
    end
end

% 使用
f = @(x) sin(x);
I = trapezoid(f, 0, pi, 1000);
fprintf('∫sin(x)dx from 0 to π ≈ %.6f\n', I);

七、最佳实践 #

7.1 选择合适的循环类型 #

matlab
% 已知迭代次数:使用for
for i = 1:100
    % ...
end

% 未知迭代次数:使用while
while condition
    % ...
end

7.2 避免修改循环变量 #

matlab
% 不推荐
for i = 1:10
    i = i + 1;  % 不推荐
end

% 推荐
i = 1;
while i <= 10
    i = i + 2;
end

7.3 使用向量化 #

matlab
% 尽可能使用向量化操作
x = 0:0.01:10;
y = sin(x);  % 向量化

% 而不是
y = zeros(size(x));
for i = 1:length(x)
    y(i) = sin(x(i));
end

八、总结 #

本章学习了:

  1. for循环:遍历范围、数组、元胞数组
  2. while循环:条件循环、收敛循环
  3. 循环控制:break、continue、return
  4. 嵌套循环:多层循环、矩阵操作
  5. 向量化:避免循环、预分配数组

下一章将学习循环控制语句。

最后更新:2026-03-27