【问题标题】:Matlab--Multi dimensional dot product array?Matlab--多维点积数组?
【发布时间】:2018-03-16 11:06:17
【问题描述】:

我有两个数组,它们都包含几个 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) 

【问题讨论】:

    标签: arrays matlab multidimensional-array octave vectorization


    【解决方案1】:

    这是 MATLAB 和 Octave 的解决方案:

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

    如果是 Octave,你可以这样写:

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

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

    本质上,我们希望将一系列 vector-vector(点)操作简化为 vector-matrixmatrix-matrix手术。我们所需要的只是重塑/转置/置换数组以具有兼容的尺寸。您想要相乘的向量被排列为页面列,并且页面被连接起来形成一个 3D 数组。我们可以重新调整数组的形状,以便水平连接页面而不是沿第三维连接的页面。所以一个大小为[3 5 6]的数组可以重新整形为一个大小为[ 3 30]的矩阵。现在重新整形的数组的大小与dos的大小兼容,所以我们可以使用矩阵乘法,结果可以重新整形回原始维度。在这里,一系列 vector-vector 操作被简化为更高效的 matrix-matrix 操作。

    【讨论】:

    • 谢谢。效果很好。你/有人能解释一下它为什么起作用/它在做什么吗
    • @JesseRubin 添加了解释。
    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多