bsxfun 在 MATLAB 中仍然是最优的吗?
Is bsxfun still optimal in MATLAB?
我在搜索这个主题时确实遇到了 this 个问题,但是这个问题似乎已经过时了。
看https://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016b,隐式展开是2016b引入的,不过还是能找到论文中使用bsxfun
进行算术展开的参考代码。所以我假设在某些情况下 bsxfun
比其他方法更可取。
我确实比较了 bsxfun
、repmat
和隐式扩展之间的速度(我使用了 link 中 Jonas 的代码)
下面显示了使用tic
toc
:
计算时间的比较
这表明隐式扩展明显比bsxfun
或repmat
快。现在有什么理由使用 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"])
bsxfun
所做的只是Binary Singleton eXpansion .它比现在通常的隐式扩展更能打字。我猜 MathWorks 保留 bsxfun
是为了向后兼容,但不再适用于它;它甚至可能在内部只映射到隐式扩展。
The documentation on bsxfun
状态:
It is recommended that you replace most uses of bsxfun
with direct calls to the functions and operators that support implicit expansion. Compared to using bsxfun
, implicit expansion offers faster speed of execution, better memory usage, and improved readability of code. For more information, see Compatible Array Sizes for Basic Operations.
此外,隐式扩展似乎具有超出 bsxfun
所做的内部优化,参见 this question of mine。
更多有用的链接可以在 this answer by nirvana-msu 中找到,其中包括 MathWorks 员工讨论此问题的博客。
所以我想说使用 bsxfun
而不是隐式扩展的唯一原因是如果你 运行 2016b 之前版本的 MATLAB 上的代码。
我在搜索这个主题时确实遇到了 this 个问题,但是这个问题似乎已经过时了。
看https://blogs.mathworks.com/loren/2016/10/24/matlab-arithmetic-expands-in-r2016b,隐式展开是2016b引入的,不过还是能找到论文中使用bsxfun
进行算术展开的参考代码。所以我假设在某些情况下 bsxfun
比其他方法更可取。
我确实比较了 bsxfun
、repmat
和隐式扩展之间的速度(我使用了 link 中 Jonas 的代码)
下面显示了使用tic
toc
:
这表明隐式扩展明显比bsxfun
或repmat
快。现在有什么理由使用 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"])
bsxfun
所做的只是Binary Singleton eXpansion .它比现在通常的隐式扩展更能打字。我猜 MathWorks 保留 bsxfun
是为了向后兼容,但不再适用于它;它甚至可能在内部只映射到隐式扩展。
The documentation on bsxfun
状态:
It is recommended that you replace most uses of
bsxfun
with direct calls to the functions and operators that support implicit expansion. Compared to usingbsxfun
, implicit expansion offers faster speed of execution, better memory usage, and improved readability of code. For more information, see Compatible Array Sizes for Basic Operations.
此外,隐式扩展似乎具有超出 bsxfun
所做的内部优化,参见 this question of mine。
更多有用的链接可以在 this answer by nirvana-msu 中找到,其中包括 MathWorks 员工讨论此问题的博客。
所以我想说使用 bsxfun
而不是隐式扩展的唯一原因是如果你 运行 2016b 之前版本的 MATLAB 上的代码。