假设我有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
我想更有效地做到这一点,但我无法弄清楚如何做到这一点。
答案 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);
第一行计算A
和D
之间的所有外部产品,第二行根据要求将结果汇总在一起。
测试如下:
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秒,几乎相等。