【发布时间】:2015-10-23 16:06:31
【问题描述】:
假设我有两个矩阵:
A=50;
B=50;
C=1000;
X = rand(A,B);
Y = rand(A,B,C);
我想从Y 的每个切片C 中减去X。这是一个相当普遍的问题,我找到了三种替代解决方案:
% Approach 1: for-loop
tic
Z1 = zeros(size(Y));
for i=1:C
Z1(:,:,i) = Y(:,:,i) - X;
end
toc
% Approach 2: repmat
tic
Z2 = Y - repmat(X,[1 1 C]);
toc
% Approach 3: bsxfun
tic
Z3=bsxfun(@minus,Y,X);
toc
我正在构建一个经常(即数千次)解决此类问题的程序,因此我正在寻找最有效的解决方案。以下是常见的结果模式:
Elapsed time is 0.013527 seconds.
Elapsed time is 0.004080 seconds.
Elapsed time is 0.006310 seconds.
循环显然更慢,bsxfun 比 repmat 慢一点。当我将 X 与 Y 的切片按元素相乘(而不是相减)时,我发现了相同的模式,尽管 repmat 和 bsxfun 在乘法上更接近一些。
增加数据的大小...
A=500;
B=500;
C=1000;
Elapsed time is 2.049753 seconds.
Elapsed time is 0.570809 seconds.
Elapsed time is 1.016121 seconds.
在这里,repmat 是明显的赢家。我想知道 SO 社区中是否有人有一个很酷的技巧来加快这个操作。
【问题讨论】:
-
尝试增加矩阵的大小。你会看到
bsxfun更好。它在后台执行元素的复制。此外,这篇文章可能会提供一些见解:stackoverflow.com/questions/23879888/… - 这篇文章执行的操作类似于您正在查看的内容,并且每次尝试都有一些时间安排。bsxfun绝对是恕我直言的赢家。 -
如果您的程序执行此操作数千次,则可能值得在比这更高的级别上查看问题。也就是说,您可以一次性处理数千个案例吗?
标签: matlab matrix multidimensional-array bsxfun elementwise-operations