如何通过向量化替换双层for循环,提升MATLAB函数求和的运行速度
MATLAB双层循环求和的向量化改写方案
改写思路
MATLAB的向量化运算依托底层优化的线性代数库实现,相比解释层的for循环有数量级的性能提升,改写核心是将两个维度的输入分别构造为适配的向量/矩阵,通过元素级运算批量生成所有采样点的函数值,最后直接对全量结果求和。
适配新版本MATLAB(R2016b及以上,支持隐式扩展)的最简写法
% 注意原函数的乘法要改为元素级点乘.*,避免矩阵乘法逻辑错误 f = @(x,y) abs(cos(x+3) .* sin(y+2)); x = (1:100)'; % 构造100行1列的列向量 y = 1:100; % 构造1行100列的行向量 % 隐式扩展会自动将两个向量广播为100*100的矩阵后完成元素级计算,直接对所有元素求和 tot = sum(f(x,y), 'all'); disp(tot)
运行结果和原循环实现完全一致,输出为4.026314876227891e+03。如果sum(..., 'all')不兼容你的MATLAB版本,替换为sum(sum(...))即可实现相同的全矩阵求和效果。
兼容旧版本MATLAB的meshgrid写法
如果使用的是R2016b之前的版本,不支持隐式广播扩展,可以通过meshgrid先生成全量采样坐标网格:
f = @(x,y) abs(cos(x+3) .* sin(y+2)); % 生成100*100的坐标网格矩阵 [m, n] = meshgrid(1:100, 1:100); tot = sum(f(m,n), 'all'); disp(tot)
注意事项
如果实际使用的自定义函数更复杂,要保证函数内所有运算都为元素级运算:乘法、除法、幂运算前都需要加.,即使用.*、./、.^替代*、/、^,避免触发矩阵运算逻辑导致报错或结果异常。
内容的提问来源于stack exchange,提问作者sonicboom
相关产品推荐
相关产品推荐

