查找匹配的行

问题描述

给出两个具有相同列数的矩阵 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

Index of

这也可以默认写为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之类的东西不仅会显示成员身份,而且还会显示相等行的位置。