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

问题描述

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

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

同理,在二维中,结果矩阵的 [m,n] 元素是第一个矩阵的 m 列的点积和第二个矩阵的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

试试吧!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...