Matlab:通过矢量列表减去3D数组中的矢量

时间:2014-05-29 18:04:08

标签: matlab matrix multidimensional-array vectorization linear-algebra

我有n组,每组有m个维数为d的向量。这些由d * m * n矩阵A表示。

我有n个维数为d的向量,由d * n矩阵B表示。

现在我想通过B中相应的向量i减去组i中的所有m个向量(我对所有i = 1,...,n都这样做)。

这可以简单地完成:

C = zeros(size(A));
for  i = 1:n
    for j = 1:m
        C(:,j,i) = A(:,j,i) - B(:,i);
    end
end

然而,由于循环,这很慢。有人可以建议我一个非常快速的方法吗?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

bsxfun 的完美案例 -

C = bsxfun(@minus,A,permute(B,[1 3 2]))

答案 1 :(得分:3)

试一试:

B = repmat(reshape(B,[d 1 n]),[1 m 1]);
C = A - B;

修改

Divakar的解决方案更快。对于100次运行,d = 50; m = 75; n = 100;平均时间如下:

Nesbit's - .0165s
迪瓦卡的 - .0013s
我的 - .0023s