用bsxfun配料外部产品



假设我有两个向量,我想做一个外积。我可以使用:

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);

第一行计算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.0456秒,直接乘法需要0.0075秒,尽管我怀疑我的解决方案实际上做了6次,由于排列,这不是直接乘法。所以每个外积bsxfun需要0.0076秒,这几乎相等。

相关内容

  • 没有找到相关文章

最新更新