【发布时间】:2017-08-25 01:47:08
【问题描述】:
我有一个由两个 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 循环来实现爱因斯坦求和约定。不过,这似乎真的很不雅,这让我认为应该有更好的方法。有吗?
【问题讨论】: