在MATLAB中乘以矩阵数组

时间:2017-03-30 22:53:24

标签: arrays matlab matrix

我有一个由两个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循环来实现爱因斯坦求和惯例。然而,这似乎非常不优雅,这让我觉得应该有更好的方法。有吗?

1 个答案:

答案 0 :(得分:4)

bsxfun permute的完美工作:

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]);