内积如何推广到高维数组?

How does inner product generalize to higher-dimensional arrays?

接受两个函数参数和两个数组的 APL 样式内积运算符(高阶函数)如何泛化到二维以上?我看到结果数组的维度数等于数组维度的总和减去 2,并且第一个数组的最后一个维度的大小 m 必须等于第二个数组的第一个维度的大小 n.

我将不失一般性地假设函数是加法和乘法。 然后,在一维中,向量的相应元素相乘,并将这些乘积相加以产生向量点积(标量)。

出于同样的原因,在二维中,结果矩阵的 [m, n] 元素是 m[=23= 的点积第一个矩阵的第 ] 列和第二个矩阵的第 n 行。

但是当我在内积函数的描述中谈到这一点时,他们通常会说“明显泛化到更多维度”或者干脆根本不提更高维度。那不是很有帮助。谁能解释一下它是如何计算的?

假设我有两个一致的矩阵并且想要做一个内积。

      a ← 5 2 ⍴ ⍳ 10
      b ← 2 6 ⍴ ⍳ 10
      a
1  2
3  4
5  6
7  8
9 10
      b
1 2 3  4 5 6
7 8 9 10 1 2
      a +.= b
1 0 0 0 0 1
0 0 1 0 0 0
0 0 0 0 1 0
0 1 0 0 0 0
0 0 0 1 0 0
      a +.× b
15 18  21  24  7 10
31 38  45  52 19 26
47 58  69  80 31 42
63 78  93 108 43 58
79 98 117 136 55 74

这里重要的是 a 的尾部维度,即 ¯1↑⍴a,与 b 的前导维度或 1↑⍴b 相匹配。类似地,结果的形状是两个参数形状的串联,减去 a 的尾部维度和 b 的前导维度,或 (¯1↓⍴a),1↓⍴b.

假设现在我有更高维的数组,那么同样的规则也适用。 a 的尾部尺寸必须与 b 等的前导尺寸相匹配

非显而易见向更高维度的推广是,此操作与两个矩阵的内积没有区别,前提是您折叠相关维度.

      a ← 5 1 2 1 2 1 2 ⍴ ⍳ 40 
      b ← 2 3 4 5 ⍴ ⍳ 120

要折叠维度,只需将 a 的最后一个维度和 b 的第一个维度以外的所有维度相乘即可。

      a1 ← 20 2 ⍴ ⍳ 40
      b1 = 2 60 ⍴ ⍳ 120

做手术

      r1 ← a1 +.× b1

最后,将折叠的维度放回去。

      r ← 5 1 2 1 2 1 3 4 5 ⍴ r1

试试吧!