Matlab - 多维点积数组?

时间:2017-10-04 22:45:02

标签: arrays matlab multidimensional-array octave vectorization

我有两个数组,其中包含几个3x1向量。阵列是不同的尺寸。我试图创建一个数组,其中包含每个组合的点积,而不使用(for)循环,但我似乎无法弄清楚如何做到这一点。非常感谢任何想法提示或技巧

a = 5;
b = 6;
c = 10;

% 2 arrays
% uno is 3xAxB
% dos is 3xC
uno = rand(3, a, b);
dos = rand(3, c);

% Array to hold all the dot products
tres = zeros(a, b, c)

for m = 1:a
    for n = 1:b
        for p = 1:c
            u = uno(:,m, n);
            d = dos(:,p);
            tres(m, n, p) = u'*d
        end
    end
end

% WHY CAN I NOT DO THIS???
% How do I get all the dot products quickly and via vectorization?
% x = 1:a
% y = 1:b
% z = 1:c
% 
% tres(x, y, z) = uno(:,x, y)'*dos(:,z) 

1 个答案:

答案 0 :(得分:0)

这是MATLAB和Octave的解决方案:

tres=reshape(reshape(uno,3,[]).' * dos, a,b,c);

在Octave的情况下,你可以写:

tres=reshape((dos.' * uno).',a,b,c);

*第一种解决方案更便宜,因为它只包含一个转置。

基本上我们希望将一系列矢量矢量(点)操作减少为矢量矩阵矩阵矩阵操作。我们所需要的只是重塑/转置/置换数组以具有兼容的尺寸。要乘法的向量按页面列排列,页面连接形成3D数组。我们可以重新整形数组,以便不是沿着第三维连接的页面,而是水平连接。因此,可以将大小为[3 5 6]的数组重新整形为大小为[ 3 30]的矩阵。重新整形的数组的大小与dos的大小兼容,因此我们可以使用矩阵乘法和结果可以重新塑造回原始尺寸。这里将一系列矢量矢量操作简化为更高效的矩阵矩阵操作。