【问题标题】:Is bsxfun still optimal in MATLAB?bsxfun 在 MATLAB 中仍然是最优的吗?
【发布时间】:2022-01-03 11:35:36
【问题描述】:

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

阅读https://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016b,2016b引入了隐式扩展,但我仍然可以在论文中找到参考代码使用bsxfun进行算术扩展。所以我假设在某些情况下,bsxfun 比其他方法更可取。

我确实比较了bsxfunrepmat 和隐式扩展之间的速度(我使用了来自link 的 Jonas 的代码)

下面是使用tictoc计算时间的对比:

这表明隐式扩展明显快于bsxfunrepmat。现在有什么理由使用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"])

【问题讨论】:

  • 另请注意,隐式扩展似乎做了一些(意外)optimizations bsxfun 不做

标签: matlab bsxfun


【解决方案1】:

bsxfun 所做的只是 Binary Singleton eXpansion。它比现在通常的隐式扩展更打字。我猜 MathWorks 保留了 bsxfun 以实现向后兼容性,但不再适用于它;它甚至可能在内部只是映射到隐式扩展。

The documentation on bsxfun 状态:

建议您将bsxfun 的大部分用法替换为直接调用支持隐式扩展的函数和运算符。与使用bsxfun 相比,隐式扩展提供了更快的执行速度、更好的内存使用率和更高的代码可读性。如需更多信息,请参阅Compatible Array Sizes for Basic Operations

此外,隐式扩展似乎具有超出bsxfun 所做的内部优化,请参阅this question of mine
更多有用的链接可以在 this answer by nirvana-msu 中找到,其中包括 MathWorks 员工讨论此问题的博客。

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

【讨论】:

  • 阅读文档是多么棒的传统:D
  • 如果应用的二元运算不进行隐式单例扩展,它可能也很有用。也许这是您自己编写的 MEX 文件函数。但是,是的,向后兼容性是保留它的一个非常重要的原因。
  • @CrisLuengo 这可能通过大多数用途而不是所有用途在文档中暗示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 2014-09-15
  • 2016-10-20
  • 1970-01-01
相关资源
最近更新 更多