如何进行快速的多维矩阵向量乘法?
Posted
技术标签:
【中文标题】如何进行快速的多维矩阵向量乘法?【英文标题】: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 我已将您的问题退回到以前的状态。这是因为您更新了您的问题,同时给出了两个答案,包括您接受为“有帮助”的答案已过时。如果您有新问题,请打开一个新问题,而不是扩展这个问题。
【参考方案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 矩阵结束,我不确定如何恢复原状以上是关于如何进行快速的多维矩阵向量乘法?的主要内容,如果未能解决你的问题,请参考以下文章