习语#1和#5是FinnAPL成语库的同名:“渐进式索引(没有替换)”:
((⍴X)⍴⍋⍋X⍳X,Y)⍳(⍴Y)⍴⍋⍋X⍳Y,X ⍝ idiom #1
((⍋X⍳X,Y)⍳⍳⍴X)⍳(⍋X⍳Y,X)⍳⍳⍴Y ⍝ idiom #5这种两极化有什么重要的标志吗?
边注:
在APL中强调身份是自一开始就区别于APL的特征之一。APL的创建者肯尼斯·艾弗森说:
“同一性是两种不同表达方式之间的等价。虽然恒等式通常被认为只是数学分析的工具,但它们可以是简化和修改用于定义函数的表达式的重要实用工具。“
发布于 2013-07-05 20:24:15
这些成语有一些共同之处。这两种方法的最后一步都是一个索引操作,它们都使用某种镜像的级联策略,也许最重要的是,左参数和右参数的输出都是相同的。这在相当大程度上简化了身份的搜索,因为我们可以比较正确的1号参数和正确的参数#5:
(⍴Y)⍴⍋⍋X⍳Y,X ⍝ right arg #1
(⍋X⍳Y,X)⍳⍳⍴Y ⍝ right arg #5另一件可以简化搜索的事情是删除或修改任何截断输出的内容,因为这两个参数的输出是相同的,而没有截断。习语1使用(⍴Y)⍴将其截断为Y的长度,而成语#5中右参数的长度取决于⍳⍴Y中Y的长度。在第一种情况下,可以删除截断,在第二种情况下,可以将其修改为Y,X的完整长度:
⍋⍋X⍳Y,X ⍝ #1
(⍋X⍳Y,X)⍳⍳⍴Y,X ⍝ #5考虑到这两个表达式都包含⍋X⍳Y,X,让我们将其赋值给变量A ← ⍋X⍳Y,X并进行简化。但是,重要的是要指出,我们现在拥有的恒等式只适用于A是置换向量时,我稍后会更多地讨论这个问题。与此同时,我们有这样的身份:
⍋A ←→ A⍳⍳⍴Y,X由于‘Y,X’在这个表达式中除了提供向量长度之外什么也不做,而且由于这个长度等于‘A,所以恒等式可以简化为它的最终形式:
⍋A ←→ A⍳⍳⍴A, where A is a permutation vector这很有道理。升级操作符位于标识的左侧,返回如果按升序排列的A的每个值将具有的索引值。右边的index-of运算符返回⍳⍴A升序值所在的A中的索引。例如:
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)将称为置换向量。”从一些成语本身来看,您可以看到这种想法以各种方式表现出来:
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中,表达式的右侧是升序基数成语,我在另一个帖子中讨论了这个习语,在那篇文章中,我谈到了升级运算符在两种状态、秩和索引之间来回切换的事实,因此我们有以下两个标识:
⍋X ←→ ⍋⍋⍋X ←→ ⍋⍋⍋⍋⍋X ...
⍋⍋X ←→ ⍋⍋⍋⍋X ←→ ⍋⍋⍋⍋⍋⍋X ...如果X是成语#7所确定的置换向量,则第二个恒等式可以扩展如下:
X ←→ ⍋⍋X ←→ ⍋⍋⍋⍋X ←→ ⍋⍋⍋⍋⍋⍋X …我们知道,升级运算符将从1到参数中的值数的所有数字返回。再应用两次梯度算子,得到完全相同的向量。因此,成语#7只是说置换向量包含从1到其他值的所有数字一次,而且只有一次。(这假定1被设置为第一个索引值。)
上述习语列表的另一个有趣之处是,习语#48和#212是答案中讨论的标识的左右侧:
⍋A ←→ A⍳⍳⍴Y,Xhttps://stackoverflow.com/questions/17496378
复制相似问题