我有一个矩阵A
和一个三维矩阵B
。我想总结(i
)
A(i,:)*B(i,:,:)
,
但i
没有循环。
答案 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);
C = zeros(1,size(B,3));
for i=1:n
C = C + A(i,:)*squeeze(B(i,:,:));
end
基本上它通过A
的相应切片执行B
的每一行的矩阵乘法,并累加总和。
通过在循环外部置换矩阵B
可以略微改善这一点,从而避免多次调用squeeze
......
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(:))