gpt4 book ai didi

arrays - Matlab - bsxfun 不再比 repmat 快?

转载 作者:太空宇宙 更新时间:2023-11-03 19:07:27 26 4
gpt4 key购买 nike

我试图找到在 Matlab 中标准化矩阵的最快方法(零均值、单位方差列)。这一切都归结为对矩阵中的所有行应用相同操作的最快方法。我读过的每篇文章都得出了相同的结论:使用 bsxfun 而不是 repmat。这篇由 Mathworks 撰写的文章就是一个例子:http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/

但是,在我自己的计算机上尝试此操作时,repmat 总是更快。以下是我使用与文章中相同的代码得出的结果:

m = 1e5;
n = 100;
A = rand(m,n);

frepmat = @() A - repmat(mean(A),size(A,1),1);
timeit(frepmat)

fbsxfun = @() bsxfun(@minus,A,mean(A));
timeit(fbsxfun)

结果:

ans =

0.0349


ans =

0.0391

事实上,在这种情况下,无论输入矩阵多小或多大,我都无法让 bsxfun 比 repmat 表现得更好。

谁能解释一下?

最佳答案

您正在阅读的大部分建议,包括来自 Loren 的博客文章,可能是指旧版本的 MATLAB,bsxfunrepmat。在 R2013b (请参阅链接中的“性能”部分),repmat 被重新实现以在应用于数字、字符和逻辑参数时提供较大的性能改进。在最近的版本中,它的速度可以与 bsxfun 大致相同。

对于它的值(value),我在装有 R2014a 的机器上得到了

m = 1e5;
n = 100;
A = rand(m,n);

frepmat = @() A - repmat(mean(A),size(A,1),1);
timeit(frepmat)

fbsxfun = @() bsxfun(@minus,A,mean(A));
timeit(fbsxfun)

ans =
0.03756
ans =
0.034831

所以它看起来像 bsxfun 仍然快一点,但并不多 - 在您的机器上情况似乎相反。当然,如果您改变 A 的大小或您正在应用的操作,这些结果可能会再次发生变化。

可能还有其他原因更喜欢一种解决方案,例如优雅(如果可能的话,我更喜欢 bsxfun)。


编辑:评论者要求给出更喜欢 bsxfun 的具体原因,暗示它可能通过避免临时使用比 repmat 使用更少的内存复制 repmat 没有的内容。

我认为事实并非如此。例如,打开任务管理器(或 Linux/Mac 上的等效项),查看内存级别,然后键入:

>> m = 1e5; n = 8e3; A = rand(m,n);
>> B = A - repmat(mean(A),size(A,1),1);
>> clear B
>> C = bsxfun(@minus,A,mean(A));
>> clear C

(调整 mn 直到跳跃在图表中可见,但不要太大以至于内存不足)。

我从 repmatbsxfun 中看到完全相同的行为,内存平稳地上升到新的水平(基本上是 A< 的两倍),没有临时的额外峰值。

即使原地操作也是如此。再次查看内存并输入:

>> m = 1e5; n = 8e3; A = rand(m,n);
>> A = A - repmat(mean(A),size(A,1),1);
>> clear all
>> m = 1e5; n = 8e3; A = rand(m,n);
>> A = bsxfun(@minus,A,mean(A));

再次,我从 repmatbsxfun 中看到完全相同的行为,即内存上升到峰值(基本上是 A< 的两倍),然后回落到上一层。

因此,恐怕我看不出 repmatbsxfun 在速度或内存方面有多大技术差异。我对 bsxfun 的偏好实际上只是个人偏好,因为它感觉更优雅一些。

关于arrays - Matlab - bsxfun 不再比 repmat 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28722723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com