我有一个由两个1800 x 900 x 3 x 3阵列组成的数据集,每个阵列应解释为一个由3x3矩阵组成的1800x900阵列。作为分析的一部分,我需要在1800x900阵列的每个点上创建另一个这样的数组,将相应的3x3矩阵相乘。
我能想到的似乎有两种方法可以做到这一点。显而易见的方法是
C = zeros(size(A))
for i = 1:900
for j = 1:1800
C(i,j,:,:) = A(i,j,:,:)*B(i,j,:,:)
end
end
但这是一个很长的循环,并没有真正利用MATLAB的矢量化。另一种方式是
C = zeros(size(A))
for i = 1:3
for j = 1:3
for k = 1:3
C(:,:,i,j) = C(:,:,i,j) + A(:,:,i,k).*B(:,:,k,j)
end
end
end
大尺寸被矢量化,我基本上使用for循环来实现爱因斯坦求和惯例。然而,这似乎非常不优雅,这让我觉得应该有更好的方法。有吗?
答案 0 :(得分:4)
C = permute(sum(bsxfun(@times, A, permute(B, [1 2 5 3 4])), 4), [1 2 3 5 4]);
在R2016b之后,由于implicit singleton expansion,您可以避免bsxfun
:
C = permute(sum(A .* permute(B, [1 2 5 3 4]), 4), [1 2 3 5 4]);