我有一个数据集,其中包含两个1800 x 900 x 3 x 3的数组,每个数组都应解释为一个1800 x 900的3 x 3矩阵数组。作为分析的一部分,在某一点上,我需要通过将对应的3 x 3矩阵相乘来在每个1800 x 900矩阵中创建另一个这样的数组。
我认为有两种方法可以实现这个目标。显而易见的方法是:
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循环来实现Einstein求和约定。但这种方法看起来非常不优雅,我认为应该有更好的方式。有吗?
bsxfun
,我很难比链接帖子中的解释更好。请阅读它并让我知道您是否有任何问题。在这里使用permute
是为了“对齐”维度,以便根据需要进行单例扩展。 - Luis Mendosqueeze
。或者更好的方法是使用permute
。在你的情况下并不重要,但如果矩阵是1
x3
而不是3
x3
,squeeze
函数会将A(i,j,:,:)
(大小为1
x1
x1
x4
)转换为4
x1
,而不是所需的1
x4
。因此,请使用permute(..., [3 4 1 2])
将第三和第四维度移动到“前面”。 - Luis Mendo