如何进行快速的多维矩阵向量乘法?

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 矩阵结束,我不确定如何恢复原状

以上是关于如何进行快速的多维矩阵向量乘法?的主要内容,如果未能解决你的问题,请参考以下文章

由正交矩阵构建的仿射变换矩阵求逆的快速算法

如何将两个向量相乘并得到一个矩阵?

numpy矩阵向量乘法[重复]

如何将 glRotatef() 转换为 glMultMatrixd() 的乘法矩阵

矩阵乘法的几何意义

向量矩阵乘法、浮点向量、二进制矩阵