0

我有一个矩阵A和一个三维矩阵B。我想求和(按i

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

但没有循环i

4

3 回答 3

4

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

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

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

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

但很可能第一个解决方案会表现得更好。

于 2013-08-26T11:12:10.060 回答
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);

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

我将留给您使用正在使用的实际尺寸来比较两者。

于 2013-08-26T10:18:34.363 回答
1

我看到评论与我的想法并不完全一致。也许这就是您正在寻找的:

M=bsxfun(@times,A,B); 
sum(M(:))
于 2013-08-26T10:29:30.890 回答