一、“预分配内存”:给数组“先占座”🪑
关键字:预分配、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找慢代码,针对性优化。