【问题标题】:Batching outer products with bsxfun使用 bsxfun 批量处理外部产品
【发布时间】:2015-09-20 11:19:22
【问题描述】:

假设我有 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

我想更有效地做到这一点,但我不知道怎么做。

【问题讨论】:

  • 您正在寻找一种将bsxfunpermute 结合使用的解决方案。
  • C = bsxfun(@times,A,permute(D.',[3 1 2])); 在很短的时间内给了我一个1000x6x1000,但我不确定这是不是正确的结果。
  • 结果应该是 1000x1000
  • @Adriaan 干得好!所以,在那之后,用sum(C,2)去掉第二个dim,从而用bxsfun模拟矩阵乘法。
  • @Divakar 感谢您的提示。今晚我会输入答案。

标签: matlab vectorization bsxfun


【解决方案1】:

只需将两个矩阵相乘即可​​:

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(:))

【讨论】:

  • 很好的解决方案,虽然我不会使用j 作为variable。我今晚会做一个timeit 看看哪个更快。
【解决方案2】:

毕竟你可以使用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.0076s,几乎相等。

【讨论】:

  • 这是我会采取的解决方案。 +1。
猜你喜欢
  • 2022-11-26
  • 2018-01-01
  • 1970-01-01
  • 2019-01-27
  • 2015-06-17
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2021-08-18
相关资源
最近更新 更多