查找匹配行

Finding matching rows

给定两个具有相同列数的矩阵 AB 我想知道是否有任何行是在 AB 中相同。在 Dyalog APL 中,我可以像这样使用函数 split

(↓A) ∊ ↓B

有没有不用split函数也能计算出相同结果的方法?

您发现 Membership in that it implies that the right argument is a set of scalars rather than looking at it as a collection of major cells. This precluded extension according to Leading axis theory. However, Index of 中的一个设计缺陷被 扩展,因此我们可以利用它 returns 未找到主要单元格时超出查找数组末尾的索引:

      ⎕← 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

Try it online!

这里也可以默认写成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 这样的东西不仅会显示成员资格,还会显示相等行的位置。