首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >渐进索引成语中的APL恒等式

渐进索引成语中的APL恒等式
EN

Stack Overflow用户
提问于 2013-07-05 20:24:15
回答 1查看 122关注 0票数 3

习语#1和#5是FinnAPL成语库的同名:“渐进式索引(没有替换)”:

代码语言:javascript
复制
((⍴X)⍴⍋⍋X⍳X,Y)⍳(⍴Y)⍴⍋⍋X⍳Y,X             ⍝ idiom #1
((⍋X⍳X,Y)⍳⍳⍴X)⍳(⍋X⍳Y,X)⍳⍳⍴Y             ⍝ idiom #5

这种两极化有什么重要的标志吗?

边注:

在APL中强调身份是自一开始就区别于APL的特征之一。APL的创建者肯尼斯·艾弗森说:

“同一性是两种不同表达方式之间的等价。虽然恒等式通常被认为只是数学分析的工具,但它们可以是简化和修改用于定义函数的表达式的重要实用工具。“

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-05 20:24:15

这些成语有一些共同之处。这两种方法的最后一步都是一个索引操作,它们都使用某种镜像的级联策略,也许最重要的是,左参数和右参数的输出都是相同的。这在相当大程度上简化了身份的搜索,因为我们可以比较正确的1号参数和正确的参数#5:

代码语言:javascript
复制
(⍴Y)⍴⍋⍋X⍳Y,X                ⍝ right arg #1
(⍋X⍳Y,X)⍳⍳⍴Y                ⍝ right arg #5

另一件可以简化搜索的事情是删除或修改任何截断输出的内容,因为这两个参数的输出是相同的,而没有截断。习语1使用(⍴Y)⍴将其截断为Y的长度,而成语#5中右参数的长度取决于⍳⍴YY的长度。在第一种情况下,可以删除截断,在第二种情况下,可以将其修改为Y,X的完整长度:

代码语言:javascript
复制
⍋⍋X⍳Y,X                     ⍝ #1
(⍋X⍳Y,X)⍳⍳⍴Y,X              ⍝ #5

考虑到这两个表达式都包含⍋X⍳Y,X,让我们将其赋值给变量A ← ⍋X⍳Y,X并进行简化。但是,重要的是要指出,我们现在拥有的恒等式只适用于A是置换向量时,我稍后会更多地讨论这个问题。与此同时,我们有这样的身份:

代码语言:javascript
复制
⍋A ←→ A⍳⍳⍴Y,X

由于‘Y,X’在这个表达式中除了提供向量长度之外什么也不做,而且由于这个长度等于‘A,所以恒等式可以简化为它的最终形式:

代码语言:javascript
复制
⍋A ←→ A⍳⍳⍴A, where A is a permutation vector

这很有道理。升级操作符位于标识的左侧,返回如果按升序排列的A的每个值将具有的索引值。右边的index-of运算符返回⍳⍴A升序值所在的A中的索引。例如:

代码语言:javascript
复制
5 2 1 4 3                   ⍝ A←5 2 1 4 3
3 2 5 4 1                   ⍝ ⍋A

5 2 1 4 3                   ⍝ A←5 2 1 4 3
1 2 3 4 5                   ⍝ ⍳⍴A
3 2 5 4 1                   ⍝ A⍳⍳⍴A

看看最后两行,1在A中有3的索引,2有2,3有5,4有4,最后5有1,这是有意义的,因为从定义上看,这就是等级提升运算符所做的。

置换向量

如前所述,只有当A是置换向量时,这个恒等式才是有效的。作为一种思想工具,肯尼思·艾弗森在他的论文中定义了一个置换向量:“一个向量P,其元素是其指数的某种排列(即^/1=+/P∘.=⍳⍴P)将称为置换向量。”从一些成语本身来看,您可以看到这种想法以各种方式表现出来:

代码语言:javascript
复制
Y[⍋Y]^.=X[⍋X]           #6 permutations of each other 
X^.=⍋⍋X                 #7 test if permutation vector
X[⍋X]^.=⍳⍴X             #29 test if permutation vector
⍋X                      #48 Inverting a permutation 
X⍳⍳⍴X                   #212 Inverting a permutation
^/1=+⌿X∘.=⍳⍴X           #281 test if permutation vector
^/(⍳⍴X)∊X               #454 test if permutation vector
A←⍳⍴X ⋄ A[X]←A ⋄ A      #654 Inverting a permutation 

在成语#7中,表达式的右侧是升序基数成语,我在另一个帖子中讨论了这个习语,在那篇文章中,我谈到了升级运算符在两种状态、秩和索引之间来回切换的事实,因此我们有以下两个标识:

代码语言:javascript
复制
⍋X ←→ ⍋⍋⍋X ←→ ⍋⍋⍋⍋⍋X ...
⍋⍋X ←→ ⍋⍋⍋⍋X ←→ ⍋⍋⍋⍋⍋⍋X ...

如果X是成语#7所确定的置换向量,则第二个恒等式可以扩展如下:

代码语言:javascript
复制
X ←→ ⍋⍋X ←→ ⍋⍋⍋⍋X ←→ ⍋⍋⍋⍋⍋⍋X …

我们知道,升级运算符将从1到参数中的值数的所有数字返回。再应用两次梯度算子,得到完全相同的向量。因此,成语#7只是说置换向量包含从1到其他值的所有数字一次,而且只有一次。(这假定1被设置为第一个索引值。)

上述习语列表的另一个有趣之处是,习语#48和#212是答案中讨论的标识的左右侧:

代码语言:javascript
复制
⍋A ←→ A⍳⍳⍴Y,X
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17496378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档