内积如何推广到高维数组?
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
试试吧!
接受两个函数参数和两个数组的 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
试试吧!