假设我有两个向量,我想做一个外积。我可以使用:
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
我想更有效地做这件事,但我不知道该怎么做。
只需将两个矩阵相乘:
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(:))
毕竟可以使用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.0456秒,直接乘法需要0.0075秒,尽管我怀疑我的解决方案实际上做了6次,由于排列,这不是直接乘法。所以每个外积bsxfun
需要0.0076秒,这几乎相等。