在MATLAB标准性能优化技术 — 循环优化(1)的基础上继续介绍循环优化的相关方法。
提前结束循环
for i = 1:length(A)
if A(i) < 0
continue
end
% 在这里编写处理非负元素的代码
end
[m, n] = size(A);
for i = 1:m
for j = 1:n
if A(i,j) == target
% 找到了目标值,记录位置并结束循环
row = i;
col = j;
break;
end
end
% 如果找到了目标值,退出循环
if exist('row', 'var') && exist('col', 'var')
break;
end
end
将I/O操作推迟到循环结束
例如:
data = magic(3);
% 在循环中进行I/O操作
tic
for col = 1 : size(data,2)
for row = 1 : size(data,1)
cellAddr = ['A'+col-1 '1'+row-1];
range = [cellAddr ':' cellAddr];
xlswrite('test.xls',data(row,col),range);
end
end
t1 = toc
将循环优化为:
lastCellAddr = ['A'+size(data,1)-1 '1'+size(data,2)-1];
range = ['A1:' lastCellAddr];
xlswrite('test.xls',data,range);
速度可提升8x以上。
简化重复引用
% 简单的循环用于访问数组元素
a = [0,0];
for idx = 1 : 1e8
a(2) = a(2) + idx;
end
% 对上述循环使用一个临时累加器可以提高性能
a = [0,0];
b = 0;
for idx = 1 : 1e8
b = b + idx; % b instead of a(2)
end
a(2) = b;b;
简化重复引用适用于任何数据类型,包括元胞数组(如c{1}{2,3}(4))。
同样,在访问结构、表或类对象字段时:
% 更新结构数组示例
for idx = 1 : 1e6
a(3).b(2,3).c(4).d = rand(1);
end
% 使用临时变量val替换结构数组a(3).b(2,3).c(4).d,可以提高性能
for idx = 1 : 1e6
val = rand(1);
end
a(3).b(2,3).c(4).d = val;
% 检索结构数组示例
for idx = 1 : 1e6
val = a(3).b(2,3).c(4).d * rand(1);
end
% 通过v替代数组a(3).b(2,3).c(4).d,可以提高性能
v = a(3).b(2,3).c(4).d;
for idx = 1 : 1e6
val = v*rand(1);
end
—— end ——
联系客服