假设我有两个一致的矩阵并且想做一个内积。
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
试试看!