bsxfun 在 MATLAB 中仍然是最优的吗?

Jan*_*ang 4 matlab bsxfun

我在搜索这个主题时确实遇到了这个问题,但这似乎已经过时了。

阅读https://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016bbsxfun ,隐式扩展是在2016b中引入的,但我仍然可以在用于算术的论文中找到参考代码扩张。因此我认为在某些情况下比bsxfun其他方法更可取。

bsxfun我确实比较了、和隐式扩展之间的速度(我使用了链接repmat中乔纳斯的代码)

下面显示了使用以下方法计算时间的比较tic toc

使用 tic 和 toc 的计算时间比较

这表明隐式扩展显然比bsxfun或更快repmatbsxfun现在还有什么理由使用吗?

这是我用来比较速度的代码:

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"])
Run Code Online (Sandbox Code Playgroud)

Adr*_*aan 7

所做的一切bsxfun都是B inary S ingleton e X pansion。它比现在通常的隐式扩展需要更多的打字。我猜 MathWorks 保留了bsxfun向后兼容性,但不再适用;它甚至可能在内部只是映射到隐式扩展。

有关说明的文档bsxfun

建议您将 的大部分用法替换bsxfun为直接调用支持隐式扩展的函数和运算符。与使用相比bsxfun,隐式扩展提供了更快的执行速度、更好的内存使用率以及更高的代码可读性。有关详细信息,请参阅基本操作的兼容数组大小

此外,隐式扩展似乎具有超越bsxfun的这个问题的内部优化。更多有用的链接可以在nirvana-msu 的回答
中找到,此外还有 MathWorks 员工讨论此问题的博客。

所以我想说,使用bsxfun而不是隐式扩展的唯一原因是如果您在 2016b 之前版本的 MATLAB 上运行代码。

  • 阅读文档是多么伟大的传统啊:D (3认同)