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

关键字

:预分配、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找慢代码,针对性优化。