代码优化 🚀 让MATLAB代码“跑更快”:从“龟速循环”到“火箭效率”

243次阅读

一、“预分配内存”:给数组“先占座”🪑

关键字:预分配、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 招,代码直接从“龟速”变“火箭”:

  1. 预分配内存 :循环前用zeros 给数组“占座”,避免动态扩容;
  2. 向量化运算:能用矩阵 / 数组运算就不用 for 循环,代码短 + 速度快;
  3. 计时测试 :用timeit 找慢代码,针对性优化。
正文完
 0