1

FinnAPL 库中的第三项称为“由 X 表示的 Y 的子向量的累积最大值 (⌈)”,其中 X 是二进制向量,Y 是数字向量。这是它的用法示例:

X←1 0 0 0 1 0 0 0
Y←9 78 3 2 50 7 69 22
Y[A⍳⌈\A←⍋A[⍋(+\X)[A←⍋Y]]]       ⍝ output 9 78 78 78 50 50 69 69

您可以看到,从 X 数组中的开头或任何 1 值开始,在 Y 中找到所有对应数字的累积最大值,直到在 X 中找到另一个 1。在给出的示例中,X 将数组分成两部分每个 4 个数字的相等部分。在第一部分中,9 是遇到 78 之前的最大值,而在第二部分中,50 是遇到 69 之前的最大值。

这很容易理解,我可以按原样盲目使用它,但我想了解它是如何工作的,因为 APL 习语本质上是由运算符和函数组成的算法。要很好地理解 APL,重要的是要了解大师们如何能够将它们编织成如此紧凑而优雅的代码行。

我发现这个特殊的习语特别难以理解,因为索引嵌套了两层深。所以我的问题是,是什么让这个成语打勾?

4

2 回答 2

2
于 2013-07-03T12:11:29.770 回答
0

我的实现:

      X←1 0 0 0 1 0 0 0
      Y←9 78 3 2 50 7 69 22

      ¯1+X/⍳⍴X ⍝ position
0 4 
      (,¨¯1+X/⍳⍴X)↓¨⊂Y
 9 78 3 2 50 7 69 22  50 7 69 22

      (1↓(X,1)/⍳⍴X,1)-X/⍳⍴X ⍝ length
4 4 
      (,¨(1↓(X,1)/⍳⍴X,1)-X/⍳⍴X)↑¨(,¨¯1+X/⍳⍴X)↓¨⊂Y
 9 78 3 2  50 7 69 22

      ⌈\¨(,¨(1↓(X,1)/⍳⍴X,1)-X/⍳⍴X)↑¨(,¨¯1+X/⍳⍴X)↓¨⊂Y
 9 78 78 78  50 50 69 69
      ∊⌈\¨(,¨(1↓(X,1)/⍳⍴X,1)-X/⍳⍴X)↑¨(,¨¯1+X/⍳⍴X)↓¨⊂Y
9 78 78 78 50 50 69 69

祝你今天过得愉快。

于 2016-06-16T03:56:19.847 回答