【发布时间】:2015-04-27 15:58:15
【问题描述】:
我正在尝试找到在 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 更好。
谁能解释一下?
【问题讨论】:
-
对我来说,bsxfun 方法总是更快,对于更大的数组也是如此。 (Matlab 2014a)
-
在最近的 MATLAB 版本中,
repmat是一个类似bsxfun的编译函数,而在以前的版本中它是一个 m 文件,所以我期待它的性能提升。在我的系统上,使用您的示例代码,bsxfun的性能与稍好一点的性能相同(正如我所说的那样,区别在于“在洗涤中”)。但是,bsxfun仍然具有不将额外数组分配到内存中的优势。 -
bsxfun总是更好。不管需要多长时间:-P -
对于这些时间,我建议尝试更大的矩阵,例如,至少
m=1e5;n=1e3;A=rand(m,n);。 -
@user89161:更可能归结为内存和缓存。要在计算机和操作系统之间进行真正公平的比较,我们需要了解所涉及的 CPU、RAM 等。