问题描述
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
试试吧!