每行乘以矩阵的乘积和

时间:2013-08-26 09:42:43

标签: matlab matrix octave vectorization matrix-multiplication

我有一个矩阵A和一个三维矩阵B。我想总结(i

A(i,:)*B(i,:,:)

i没有循环。

3 个答案:

答案 0 :(得分:4)

这是另一种解决方案,有点短:

C = A(:).'*reshape(B,[],size(B,3));

为了更具可读性,您可以使用等效的解决方案,如

C = arrayfun(@(x) sum(sum(A.*B(:,:,x))), 1:size(B,3));

但很可能第一种解决方案表现更好。

答案 1 :(得分:3)

我将首先创建一些类似于你所描述的随机矩阵:

n = 4; m =3;
A = rand(n,m);
B = rand(n,m,5);

1)循环版本:

C = zeros(1,size(B,3));
for i=1:n
    C = C + A(i,:)*squeeze(B(i,:,:));
end

基本上它通过A的相应切片执行B的每一行的矩阵乘法,并累加总和。

通过在循环外部置换矩阵B可以略微改善这一点,从而避免多次调用squeeze ......

2)矢量化版本:

C = sum(sum(bsxfun(@times, permute(A,[2 3 1]),  permute(B, [2 3 1])),1),3);

我没有声称这应该更快。事实上,我怀疑循环版本更快,内存更少。

我会留给你比较两个正在使用的实际尺寸。

答案 2 :(得分:1)

我看到评论并不完全是我想到的。也许这就是你要找的东西:

M=bsxfun(@times,A,B); 
sum(M(:))