我有两个数组,其中包含几个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)
答案 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
的大小兼容,因此我们可以使用矩阵乘法和结果可以重新塑造回原始尺寸。这里将一系列矢量矢量操作简化为更高效的矩阵矩阵操作。