如何在APL中屏蔽扫描运算符?

4
假设我有一个数组N ← 0 0 0 1 1 1 0 0 1,如何使用扫描符号\来得到数组0 0 0 1 2 3 0 0 1+\N给了我0 0 0 1 2 3 3 3 4,这不是我想要的。 +\¨⊆⍨N给了我| 1 2 3 | 1 |,更接近目标,但我失去了原始位置信息。
是否有一种方法可以在扫描中保留原始值并进行乘法计算,或者有更好的方法?
2个回答

5

这里有几个选项。你的原始想法可以轻松地使用\进行调整。

或者,对于一个简短但效率低下(O(n^2))的解决方案,⊥⍨¨,\可行。

对于一种更高效但较长的解决方案,我改编了https://aplcart.info/?q=cumulative%20sum#

可能还有更好的方法但我太笨找不到,留给读者作为练习;)

      f ← {⍵\∊+\¨⊆⍨⍵}
      g ← ⊥⍨¨,\
      h ← {+\⍵-a\¯2-/0,(a←1,2≠/⍵)/+\¯10,⍵}
      f 0 0 0 1 1 1 0 0 1
0 0 0 1 2 3 0 0 1

      r ← ? 1e32        ⍝ random boolean array
      (∧/2≡/f,⍥⊆g,⍥⊆h)r   ⍝ they're all the same
1
      
      ]runtime -c 'f r' 'g r' 'h r'
                                                                
  f r → 3.6E¯5 |    0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕                      
  g r → 7.7E¯5 | +111% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕ 
  h r → 7.3E¯6 |  -80% ⎕⎕⎕⎕                                     

0 0 0 1 1 1 0 0 1 \ 1 2 3 1 是 0 0 0 1 2 3 0 0 1,这将把项目放回正确的位置。 - rak1507
啊,好的。我没有想到那个!现在有意义了。谢谢。 - mazin
2
顺便提一下,如果你不知道的话,聊天室 https://chat.stackexchange.com/rooms/52405/the-apl-orchard/(或apl.chat)也很有用,可以用来提问。 :) - rak1507
1
你需要先使用∊来展开数组。 - rak1507
1
你对{+⍀⍵-⍺⍀¯2-⌿0⍪⍺⌿+⍀¯1↓0⍪⍵}的改编为{+\⍵-a\¯2-/0,(a←1,2≠/⍵)/+\¯1↓0,⍵}过于复杂,因为{+⍀⍵-n⍀¯2-⌿0⍪(n←~⍵)⌿+⍀¯1↓0⍪⍵}就可以了。 - Adám
显示剩余4条评论

5

如何使用 m←{s-⌈\(s←+\⍵)×2>/0,⍵},看起来快了大约两倍?

      cmpx  'h r' 'm r'
  h r → 1.15 |   0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
  m r → 4.26 | -63% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕ 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接