假设我有两个矩阵:
A=50;
B=50;
C=1000;
X = rand(A,B);
Y = rand(A,B,C);
我想X
从每个切片C
中减去Y
. 这是一个相当普遍的问题,我找到了三种替代解决方案:
% 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 社区中是否有人有一个很酷的技巧来加快这个操作。