使用bsxfun

时间:2015-09-20 11:19:23

标签: matlab vectorization bsxfun

假设我有2个向量,我想做一个外部产品。我可以用:

A=x*y';

或者我可以像这样使用bsxfun

bsxfun(@times,x,y')

但我想批量外产品。我有2个矩阵,每个矩阵都有p个向量:

n=1000;  p=6;
A=rand(n,p);
D=rand(n,p);

我想计算所有外部产品并将结果总结如下:

AA=zeros(n,n);

for j=1:p
    AA = AA + A(:,j) * D(:,j).';
end

我想更有效地做到这一点,但我无法弄清楚如何做到这一点。

2 个答案:

答案 0 :(得分:4)

将两个矩阵相乘:

n=1000;  p=6;
A=rand(n,p);
D=rand(n,p);

way1=zeros(n,n);

for j=1:p
    way1 = way1 + A(:,j) * D(:,j).';
end

way2 = A * D.';

any(way1(:) ~= way2(:))

答案 1 :(得分:3)

毕竟你可以使用bsxfun

C = bsxfun(@times,A,permute(D,[3 2 1]));
result = sum(C,2);

第一行计算AD之间的所有外部产品,第二行根据要求将结果汇总在一起。

测试如下:

kk = 1e3;
times1 = zeros(kk,1);
n=1000;  p=6;
A=rand(n,p);
D=rand(n,p);
for ii = 1:kk
    tic
    C = bsxfun(@times,A,permute(D.',[3 1 2]));
    result = sum(C,2);
    times1(ii) = toc;
end
mean(times1)

bsxfun需要0.0456s,直接乘法需要0.0075s,但我怀疑我的解决方案实际上做了6次,因为置换,这不是直接乘法。因此,每个外部产品bsxfun需要0.0076秒,几乎相等。