循环语句 #
一、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
八、总结 #
本章学习了:
- for循环:遍历范围、数组、元胞数组
- while循环:条件循环、收敛循环
- 循环控制:break、continue、return
- 嵌套循环:多层循环、矩阵操作
- 向量化:避免循环、预分配数组
下一章将学习循环控制语句。
最后更新:2026-03-27