apl - 如何屏蔽 APL 中的扫描运算符?

标签 apl dyalog

假设我有一个数组 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 |这更接近,但随后我失去了位置。
有没有办法在扫描和乘法中携带原始值,或者更好的方法?

最佳答案

这里有几个选项。可以使用\轻松调整您的原始想法。
或者,对于较短(但效率低下的 O(n^2))解决方案,⊥⍨¨,\作品。
为了获得更高效但更长的解决方案,我改编了 https://aplcart.info/?q=cumulative%20sum#
可能还有更好的东西,但我找不到它太糟糕了,但它留给读者作为练习;)

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

      r ← ? 1e3 ⍴ 2        ⍝ 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% ⎕⎕⎕⎕                                     

关于apl - 如何屏蔽 APL 中的扫描运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69220358/

相关文章:

debugging - 在 Dyalog RIDE 中设置条件断点

matrix - APL编程-如何将简单的矩阵转换为图片?

validation - 如何测试字符串输入? (Dyalog APL)

version-control - 原始函数序列的 Dyalog SALT.Load 异常 "could not fix"

APL 直接功能评估

apl - 使用 dyalog apl 访问脚本函数中的 )fns 函数

apl - 访问 Dyalog APL 中嵌套数组中每个数组中的相同行/列

apl - 这个 APL 代码有什么作用?

function - GNU APL 中的大括号