假设我有一个数组 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/