我使用的三个原因bsxfun
(文档、博客链接)
bsxfun
比repmat
(见下文)更快
bsxfun
需要更少的打字
- Using
bsxfun
和 using 一样accumarray
,让我对自己对 MATLAB 的理解感觉良好。
bsxfun
将沿着它们的“单一维度”复制输入数组,即数组大小为 1 的维度,以便它们与另一个数组的相应维度的大小相匹配。这就是所谓的“单例扩展”。顺便说一句,如果您调用squeeze
.
对于非常小的问题,该repmat
方法可能更快 - 但在该数组大小下,两种操作都非常快,以至于它可能不会对整体性能产生任何影响。更快有两个重要原因bsxfun
:(1)计算发生在编译代码中,这意味着数组的实际复制永远不会发生,以及(2)bsxfun
是多线程 MATLAB 函数之一。
我在我相当快的笔记本电脑上运行了 MATLAB R2012b之间repmat
的速度比较。bsxfun
对我来说,bsxfun
大约比repmat
. 如果数组变大,差异会变得更加明显:
运行时的跳跃repmat
发生在 1 MB 的数组大小附近,这可能与我的处理器缓存的大小有关 -bsxfun
跳跃并没有那么糟糕,因为它只需要分配输出数组。
您可以在下面找到我用于计时的代码:
n = 300;
k=1; %# 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);
end