一、“预分配内存”:给数组“先占座” 🪑
关键字
:预分配、zeros函数、数组动态增长
🧠 类比:就像“订餐厅”——先把座位(内存)预留好,比“来人再加座”(动态扩容)快得多!
课本里的“坑”:
sinfun1
函数在循环里让数组
动态增长
(每次循环给y加一个元素),MATLAB得反复“搬家”(重新分配内存+复制数据),导致时间按
M²比例增长
(M是数组长度)。
✋ 解决办法:用zeros预分配数组大小(先占好内存):
function y = sinfun2(M)
x = 0:M-1; % 先定义x的长度
y = zeros(1, numel(x)); % 预分配y的内存(1行,和x一样长)
for k = 1:numel(x)
y(k) = sin(x(k)/(100*pi)); % 直接往预留的位置填值
end
end
✨ 效果对比:M=20000时,sinfun1要0.2852秒,sinfun2只要0.0013秒——快了220倍!
☁️ 新手提醒:写循环前,先确定数组的最终大小,用zeros(全0)、ones(全1)预分配~
二、“向量化”:用矩阵运算“替代循环” 🧮
关键字
:向量化、矩阵运算、循环消除
🤖 MATLAB是“矩阵的主场”——用矩阵运算代替for循环,相当于“批量处理”,效率直接拉满!
课本里的进阶:
sinfun3
直接对整个数组x做运算,
完全去掉循环
:
function y = sinfun3(M)
x = 0:M-1;
y = sin(x/(100*pi)); % 直接对x数组做sin运算(向量化)
end
✋ 新手类比:就像“洗袜子”——循环是“一只一只洗”,向量化是“一筐一起洗”,速度差N倍!
☁️ 实践效果:M=20000时,sinfun3和预分配后的sinfun2速度差不多(新版MATLAB会优化循环),但代码更简洁~
✨ 向量化场景:比如生成二维正弦图像(课本里的twosines1),向量化写法(twosines2)比循环快50%以上!
三、“性能测试”:给代码“掐秒表” ⏱️
关键字
:tic/toc、timeit、运行时间对比
✋ 优化得好不好,得“测一测”——MATLAB自带的计时工具能帮你找到“慢代码”!
常用计时工具:
tic/toc:简单计时(适合快速测试):
tic; sinfun1(100); toc % 开始计时→运行代码→结束计时
timeit:可靠计时(多次运行取平均,适合精准测试):
f = @() sinfun2(20000); % 定义函数句柄 timeit(f) % 测试f的运行时间
🧠 新手建议:写代码时先“跑通”,再用timeit测瓶颈,优先优化“循环+动态数组”的部分~
四、新手避坑总结:代码优化“三板斧” 🛠️
✨ 记住这3招,代码直接从“龟速”变“火箭”:
- 预分配内存:循环前用
zeros给数组“占座”,避免动态扩容; - 向量化运算:能用矩阵/数组运算就不用for循环,代码短+速度快;
- 计时测试:用
timeit找慢代码,针对性优化。