【问题标题】:How to do a fast multidimensional matrix vector multiplication?如何进行快速的多维矩阵向量乘法?
【发布时间】:2015-11-01 20:28:43
【问题描述】:

A是一个3D N*N*L矩阵,x是一个N*1向量,我需要对其进行如下操作:

for i=1:L
    res(i)=x'*squeeze(A(:,:,i))*x
end

我希望使用最有效的矢量化方法而不是for 循环。请大家给我一些建议?

【问题讨论】:

  • 我建议更具体一点:您不需要矩阵向量乘法,而是计算二次形式。但它可能只对我有影响:)
  • 我现在不能尝试,但你可能会喜欢sum(sum(bsxfun(@times,permute(bsxfun(@times,permute(A,[3 1 2]),reshape(x,[1 1 N])),[1 3 2]),reshape(x,[1 1 N])),2),2)
  • @J.Andrew 我已将您的问题退回到以前的状态。这是因为您更新了您的问题,同时给出了两个答案,包括您接受为“有帮助”的答案已过时。如果您有新问题,请打开一个新问题,而不是扩展这个问题。

标签: performance matlab matrix vectorization matrix-multiplication


【解决方案1】:

bsxfun -

sum(reshape(bsxfun(@times,x,bsxfun(@times,A,x.')),[],L),1)

matrix-multiplication-fun -

reshape(x*x.',1,[])*reshape(A,[],L)

【讨论】:

  • 关于第二个:“你是巫师吗?”;)
  • 你看起来像一个fun 的人。
  • @Adriaan 我责怪周围的 fun-tools :)
  • 我喜欢第二个,看起来效率很高。
  • 我不知道matlab在reshape里面做了什么,我想知道为什么第二个比bsxfun更有效?谢谢!
【解决方案2】:
N=10;L=5;
A = rand(N,N,L);x=rand(N,1);
C = sum(sum(bsxfun(@times,permute(bsxfun(@times,permute(A,[3 1 2]),reshape(x,[1 1 N])),[1 3 2]),reshape(x,[1 1 N])),2),2);
C = squeeze(C(:,1,:));

感谢@AndrasDeak,尽管您确实错过了最后一次squeeze 通话。

【讨论】:

  • 我很惊讶它的工作原理:) 遗憾的是(正如预期的那样),@Divakar 的回答要优雅得多。
  • 当然,这正是我们所期望的。我尝试使用permute(x,[4 3 1 2]),它开始正确,但以 4D 矩阵结束,我不确定如何恢复原状
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2021-12-22
  • 1970-01-01
  • 2017-01-25
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多