MATLAB中bsxfun是否仍具备最优性?相比隐式扩展还有使用必要吗
MATLAB中bsxfun的现阶段适用场景
即使R2016b版本推出的隐式扩展在常规算术运算场景下性能更优,bsxfun仍然有不可替代的使用场景,主要包括以下几类:
- 旧版本兼容需求
很多科研机构、工业生产环境的MATLAB版本停留在R2016b之前,一方面正版软件升级需要额外成本,另一方面大量历史旧项目验证过的运行环境不会随意更换。这类场景下bsxfun是替代repmat做维度扩展运算的最优选择,执行效率远高于repmat实现。 - 自定义函数的广播运算
隐式扩展仅支持MATLAB内置的算术、逻辑、比较等运算符,如果你需要对两个维度不匹配的数组执行自定义函数的批量运算,隐式扩展无法支持,bsxfun就是最高效的实现方案。比如你自定义了运算函数my_calc(x,y) = sin(x).*cos(y) + x.^2./y,只需要调用bsxfun(@my_calc, A, B)就能自动完成维度匹配的批量运算,不需要手动写循环或者做数组复制。 - 显式标识运算逻辑,降低维护成本
在复杂的高维数组运算逻辑中,直接使用运算符做隐式扩展很容易让后续维护代码的人忽略维度广播的逻辑,排查bug时会增加定位成本。显式调用bsxfun可以明确标注此处存在维度扩展运算,提升代码可读性。
补充说明:目前新版本MATLAB中,bsxfun的底层实现已经和隐式扩展基本对齐,常规场景下两者的性能差异极小,只有在极小数据量的高频调用场景下才会有可感知的速度差,大规模运算场景下效率基本一致。
测试用参考代码
n = 300; k=100; %# k=100 for the second graph a = ones(10,1); rr = zeros(n,1); bb = zeros(n,1); ntt = 100; tt = zeros(ntt,1); for i=1:n; r = rand(1,i*k); for it=1:ntt; tic, x = bsxfun(@plus,a,r); tt(it) = toc; end; bb(i) = median(tt); for it=1:ntt; tic, y = repmat(a,1,i*k) + repmat(r,10,1); tt(it) = toc; end; rr(i) = median(tt); for it=1:ntt; tic, z = a + r; tt(it) = toc; end; gg(i) = median(tt); end figure; plot(bb,'b') hold on plot(rr,'r') plot(gg,'g') legend(["bsxfun","repmat","implicit"])
性能对比结果

内容的提问来源于stack exchange,提问作者Jang
相关产品推荐
相关产品推荐

