0

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

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

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

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

4

1 回答 1

0

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

      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

试试看!

于 2021-08-06T10:17:19.010 回答