我有一个矩阵A
和一个三维矩阵B
。我想求和(按i
)
A(i,:)*B(i,:,:)
,
但没有循环i
。
我有一个矩阵A
和一个三维矩阵B
。我想求和(按i
)
A(i,:)*B(i,:,:)
,
但没有循环i
。
这是另一个解决方案,有点短:
C = A(:).'*reshape(B,[],size(B,3));
为了更具可读性,您可以使用等效的解决方案,例如
C = arrayfun(@(x) sum(sum(A.*B(:,:,x))), 1:size(B,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);
我没有声称这应该更快。事实上,我怀疑循环版本更快且内存占用更少。
我将留给您使用正在使用的实际尺寸来比较两者。
我看到评论与我的想法并不完全一致。也许这就是您正在寻找的:
M=bsxfun(@times,A,B);
sum(M(:))