- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
FinnAPL Library 中的第三项称为“由 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,重要的是要了解大师们如何将它们编织成如此紧凑而优雅的代码行。
我发现这个特殊的习语特别难以理解,因为索引嵌套了两层。所以我的问题是,是什么让这个成语成为现实?
最佳答案
这个习语可以分解成更小的习语,最重要的是,它包含来自 FinnAPL 图书馆的习语 #11,标题为:
Grade up (⍋) 用于对 X 指示的 Y 的子向量进行排序
对问题中给出的 X 和 Y 使用相同的值,这是其用法示例:
X←1 0 0 0 1 0 0 0
Y←9 78 3 2 50 7 69 22
A[⍋(+\X)[A←⍋Y]] ⍝ output 4 3 1 2 6 8 5 7
和以前一样,X 将向量分成两半,输出表明,对于每个位置,需要 Y 的哪个数字来对每一半进行排序。因此,输出中的 4 表示它需要第一个位置的 Y (2) 的第 4 个数字; 3 表示第 2 个位置的第 3 个数字 (3); 1 表示第 3 个位置的第 1 个数字 (9);等等。因此,如果我们将此索引应用于 Y,我们将得到:
Y[A[⍋(+\X)[A←⍋Y]]] ⍝ output 2 3 9 78 7 22 50 69
为了理解这个升级习语中的索引,请考虑以下情况:
(+\X)[A←⍋Y] ⍝ Sorted Cumulative Addition
逐步分解:
A←⍋Y ⍝ 4 3 6 1 8 5 7 2
+\X ⍝ 1 1 1 1 2 2 2 2
(+\X)[A←⍋Y] ⍝ 1 1 2 1 2 2 2 1 SCA
A[⍋(+\X)[A←⍋Y]] ⍝ 4 3 1 2 6 8 5 7
您可以看到应用于 A 的 X 1 1 2 1 2 2 2 1
的排序累积加法 (SCA) 充当压缩左和压缩右的组合. A 中与 1 对齐的所有值都向左移动,与 2 对齐的所有值向右移动。当然,如果 X 有更多的 1,它将按照 SCA 结果的值指示的顺序压缩和定位压缩包。例如,如果 X 的 SCA 类似于 3 3 2 1 2 2 1 1 1
,您最终会得到对应于 1 的 4 位数字,然后是3位对应2,最后2位对应3。
你可能已经注意到我跳过了显示升级效果的步骤⍋
:
(+\X)[A←⍋Y] ⍝ 1 1 2 1 2 2 2 1 SCA
⍋(+\X)[A←⍋Y] ⍝ 1 2 4 8 3 5 6 7 Grade up
A[⍋(+\X)[A←⍋Y]] ⍝ 4 3 1 2 6 8 5 7
SCA 无法单独实现压缩和重排的效果。正如我在另一个 post 中讨论的那样,它有效地充当了等级。 .同样在那篇文章中,我谈到了等级和索引本质上是同一枚硬币的两个面,您可以使用等级提升在两者之间切换。因此,这就是这里发生的事情:SCA 正在转换为一个索引以应用于 A,并且效果是升级排序的子向量,如 X 所示。
从排序子向量到累积最大值
如前所述,对子向量排序的结果是一个索引,当应用于 Y 时,将数据压缩成数据包并根据 X 排列这些数据包。关键是它是一个索引,再次是等级up 被应用,它将索引转换为排名:
⍋A[⍋(+\X)[A←⍋Y]] ⍝ 3 4 2 1 7 5 8 6
这里的问题是,为什么?好吧,下一步是应用累积最大值,只有将其应用于表示每个数据包内相对大小的等级值时,这才真正有意义。查看这些值,您可以看到 4 是第一组 4 的最大值,8 是第二组的最大值。这些值对应于我们想要的输入值 78 和 69。将最大值应用于表示位置的索引值是没有意义的(至少在这种情况下),因此转换为排名是必要的。应用累积最大值给出:
⌈\A←⍋A[⍋(+\X)[A←⍋Y]] ⍝ 3 4 4 4 7 7 8 8
剩下最后一步来完成索引。在进行了累积最大值运算之后,向量值仍然表示等级,因此需要将它们转换回索引值。为此,使用索引运算符。它采用右侧参数中的值并返回它们在左侧参数中找到的位置:
A⍳⌈\A←⍋A[⍋(+\X)[A←⍋Y]] ⍝ 1 2 2 2 5 5 7 7
为了更容易看到:
3 4 2 1 7 5 8 6 left argument
3 4 4 4 7 7 8 8 right argument
1 2 2 2 5 5 7 7 result
4 在左侧参数中位于第二个位置,因此结果显示右侧参数中每 4 个 2。索引完成,将其应用于Y,我们得到预期的结果:
Y[A⍳⌈\A←⍋A[⍋(+\X)[A←⍋Y]]] ⍝ 9 78 78 78 50 50 69 69
关于algorithm - APL 中 X 指示的累积最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17447610/
我有一个像 [3,10,4,3,9,15,6,13] 这样的列表,我想找到两个不重叠的系列/序列给出通过取最大-最小值可获得的最大值.它们必须是连续的,因此您不能从 1 中减去项目 3。但是您可以从
我正在尝试创建顶部列,这是几个列行的最大值。 Pandas 有一个方法 nlargest但我无法让它成行工作。 Pandas 也有 max和 idxmax这正是我想做的,但仅限于绝对最大值。 df =
我在使用 Android 时遇到了一点问题。 我有我的 GPS 位置,明确的经纬度,以及以米为单位的搜索射线(例如 100 米),可以吗? 想象一下我在射线形成的圆心的位置,我会知道如何在 Andro
假设我有一组最小值和最大值。我想要一个数据结构,在给定外部值的情况下,它会最有效地为我提供值 >= 最小值、值 = 最小值和值 <= 最大值?,我们在Stack Overflow上找到一个类似的问题:
我有以下 Maxima 代码: m:sum(x[i],i,1,N)/N; 然后我想计算 $m^2$。 m2:m^2, sumexpand; 然后我得到双重求和: sum(sum(x[i1]*x[i2]
如何从嵌套字典中获取一个值的最小值/最大值,该字典的缺失值也包含“Nan”? *这是供引用,我找到了一个解决方案,我想我应该在这里分享它,因为我在 stackoverflow 上的任何地方都找不到答案
在千里马 12.04.0 我有一个总和 mysum : sum(u[i]^2, i, 1, N); 现在我区分它 diff(mysum, u[i]); 现在我指定一个定义的索引 i=A 来区分它 at
是否可以根据时间轴获取最小和最大时间戳?我将在 parking 场示例中进行解释。 +---------------------+------+--------+-------+-----------
基本上在几个领域有几个日期 SELECT MAX(MAX(DATE_A),MAX(DATE_B)) from table DATE_A 和 DATE_B 是日期,我基本上想要日期 A 或日期 B 的最
我创建了一个小测试,其中一个 div 根据滚动深度滑动。 我只是想知道怎么设置 A) 起点 (scrolltop = x something) B) 如何设置最大值? var pxlCount = 0
由于达到最大值,clock_gettime() 何时会使用 CLOCK_MONOTONIC 返回一个较小的值?我不是指被描述为错误的小扭曲,而是类似于计数器重置的东西。 它是时间测量的,还是与滴答的绝
我正在使用 angularjs,尤其是 $timeout 服务(setTimeout 的包装器)。它的工作原理如下: angular.module('MyApp').controller('MyCo
是否有可能获得 MinValue - 或 MaxValue未知的 T 型?如 Int其中有 Int.MinValue和 Int.MaxValue ?? 谢谢 最佳答案 正如@mpilquist 在上面
我的数据为 员工: id Name -------- 1 xyz 2 abc 3 qaz Employee_A:(Eid - 员工表,title - 职称表) eid active
我有一个日期和时间行列表,每天有多行。 对于每个唯一日期,我想获取最小和最大时间值。 如何在 Excel v10(又名 2002)中执行此操作? 最佳答案 首先,您可以使用 Excel 函数 MIN(
我有以下 SQL 表 - Date StoreNo Sales 23/4 34 4323.00 23/4 23 5
我可能错过了一些微不足道的东西。我想我还没有完全理解一些基本的交叉过滤器概念 无论如何,我创建了一个带有几个维度的交叉过滤器,并在维度上使用过滤器。我现在想知道过滤值(不是键)的最小值/最大值。 我将
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
我在这里错过了什么吗?我希望以下代码段中的 np.max 会返回 [0, 4] ... >>> a array([[1, 2], [0, 4]]) >>> np.max(a,
给定大小为 2 的列表列表,我试图找到通过索引确定最小/最大值的最快方法。目标是确定一系列 XY 点的边界/范围。 子列表未排序(按一个索引排序并不能保证另一个索引已排序)。 目前我正在做以下事情:
我是一名优秀的程序员,十分优秀!