问题描述
给出两个具有相同列数的矩阵 A 和 B 我想知道在 A中是否有相同的行和 B 。在Dyalog APL中,我可以这样使用函数 split :
(↓A) ∊ ↓B
解决方法
您发现的是Membership ∊
中的一个设计缺陷,它意味着正确的参数是一组标量,而不是将其视为主要单元的集合。根据{{3}},此排除的扩展名。但是,Leading axis theory ⍳
被扩展了,因此我们可以使用以下事实:当主单元格不在时,它返回索引到查找数组末尾之外找到:
⎕← A ← 4 2⍴2 7 1 8 2 8 1 8
2 7
1 8
2 8
1 8
⎕← B ← 5 2⍴1 6 1 8 0 3 3 9 8 9
1 6
1 8
0 3
3 9
8 9
(↓A) ∊ ↓B
0 1 0 1
Membership ← {(≢⍵) ≥ ⍵⍳⍺}
A Membership B
0 1 0 1
这也可以默认写为Membership ← ⊢∘≢ ≥ ⍳⍨
。
无论哪种方式,请注意避免绕开嵌套数组会导致明显的速度提高:
A←?1000 4⍴10
B←?1000 4⍴10
]runtime -compare "(↓A) ∊ ↓B" "A Membership B"
(↓A) ∊ ↓B → 1.6E¯4 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
A Membership B → 8.9E¯6 | -95% ⎕⎕
,
诸如A⍳B之类的东西不仅会显示成员身份,而且还会显示相等行的位置。