秩操作符与轴符号

时间:2017-10-27 04:53:33

标签: apl dyalog

几年前我在大型机上偷看了APL2,并记得为向矩阵添加矢量的问题展示解决方案。

给定a←4 4 ⍴ ⍳16⎕io←1

向行添加向量的旧方法类似于

a+(⍴a)⍴10 20 30 40

导致

11 22 33 44
15 26 37 48
19 30 41 52
23 34 45 56

并向矩阵的列添加向量

a+(4 1⍴10 20 30 40)[;1 1 1 1]

或者,如果您愿意,

a+4/4 1⍴10 20 30 40

导致

11 12 13 14
25 26 27 28
39 40 41 42
53 54 55 56

幸运的是,那天我能够打电话给那个给我看APL2的人(他已经退休但仍然接听了他的电话)并询问了第二个解决方案,他立即记得我在说什么。< / p>

新的APL2方式更简洁,更简洁,更一致,这些示例将由a+[2] 10 20 30 40a+[1] 10 20 30 40解决。凉。它在Dyalog工作。

快进十年或更长时间,我看到有一个名为The Rank Operator的新东西。第一个例子可以通过a(+⍤1) 10 20 30 40来解决(我仍然试图掌握括号的用法,我想我实际上已经重新生成了一些脑细胞,一旦我以为我理解了这一点)

尽管如此,对于使用秩运算符的第二个示例a+[1] 10 20 30 40,没有直接(至少对我来说)类似。我不能说我理解它,但在我看来,排名运算符&#34;重新演绎&#34;它的左侧参数通过折叠其尺寸,同时保持内容完整。太多年的C ++和Java影响了我对事物的思考方式。

使用排名运算符是否有a+[1] 10 20 30 40的简单解决方案?到目前为止,我发现的唯一想法是⍉(⍉a)(+⍤1) 10 20 30 40,它忽略了这一点并击败了整个目的。

为什么秩运算符优于轴表示法?哪个更好&#34;? (一个负载的术语,可以肯定)乍一看,轴标记对我来说非常容易,一个鞋子大小智商的人,要掌握。对于排名运算符,我无法说同样的话。

3 个答案:

答案 0 :(得分:8)

使用排名运算符是否有a+[1] 10 20 30 40的简单解决方案?

是的:a(+⍤1 0)10 20 30 40 https://mycompany.zendesk.com
对于二元应用,秩运算符实际上需要一个双元素右操作数(但接受一个单例,它扩展到两个元素)。 a(f⍤A B)b表示a的排名 - A子阵列应与b的排名 - B子阵列配对。因此,在您的情况下,a(+⍤1)10 20 30 40(实际上意味着a(+⍤1 1)10 20 30 40)表示a(行)的rank-1数组应该添加到rank-1数组中10 20 30 40(整个向量)。这里,a(+⍤1 0)10 20 30 40表示a(行)的rank-1数组应该添加到10 20 30 40(标量)的rank-0数组中。

为什么秩运算符优于轴表示法?

秩运算符允许您完全控制从每个参数中获取的内容,而括号轴表示法仅允许您扩展较低级别的参数。秩运算符是语言的集成部分,可以与任何函数一起使用,甚至可以与用户定义的函数一起使用,而括号轴表示法只能与二元标量函数,约简和一小部分混合函数一起使用。 / p>

哪个“更好”?

由于秩运算符遵循运算符的正常APL语法并且普遍适用,因此它减少了要记住的规则数量。此外,秩操作符还允许通过使用负数来指定相对等级。因此,虽然⍤1表示适用于等级1 的子数组,但⍤¯1表示适用于比整个参数小一级的子数组。在我看来,这足以安全地考虑秩操作符“比支架轴更好”。

我仍然试图掌握括号的用法

我个人不喜欢括号,所以我得到你来自哪里。幸运的是,您可以随时减少括号的数量。 a(+⍤1)10 20 30 40中括号的唯一原因是将数组操作数1与数组参数10 20 30 40分开。任何其他分离它们的方式也是可以接受的,我通常会使用标识函数a+⍤1⊢10 20 30 40 Try it online!
但是,您也可以Try it online!使用二元运算符,产生monadic运算符,这些运算符读得非常好:horizontally←⍤1 0 ⋄ vertically←⍤1 1 curry right operands

完整Try it online!

答案 1 :(得分:2)

多年来,一种流行的观点是方括号的使用,即索引和轴&#34;运算符&#34;对于功能,应该避免。其中一些理由是方括号语法是异常的并且与语言的其余部分不一致,方括号内的参数语义在函数组之间不同,它使解析复杂化,以及其他语法。 Google "apl axis operator anomalous"有很多例子。

<强>索引

传统索引是熟悉的x[i]形式,替代方案包括&#34;选择&#34;和&#34;小队&#34;功能。更高维度的索引数组使用x[i;j;k;...;n]形式,其中;分隔各个维度表达式。这个表达式可以用来表示&#34;所有这些维度&#34;。然后是索引分配,可以有选择地插入新值。

Axis Operator

首先,只有减少+/[1]a,压缩b/[1]a,扩展b\[1]a的轴规范,最后轮换1⌽[2]x和反转⌽[2]x。扫描+\a过了一会儿,catenation x,[1] y和lamination x,[0.5] y也是如此。 (浮点&#34;轴&#34; - 好悲伤)APL2引入了更多与案例a +[2] b不同的案例,再加上任意坐标⊂[2]

秩运算符提供了一种统一的方法来处理坐标规范。

答案 2 :(得分:1)

我相信,为了向矩阵添加矢量,您不应再使用秩运算符搜索更简单的解决方案。我认为秩操作符的引入是为了实现原始标量函数的行为,也用于定义的函数。也就是说,如果您有一个已定义的函数,请说

∇Z←A ADD B
 Z←A + B
∇

然后

a ADD[1] 10 20 30 40

会失败并强迫您使用排名运算符。 rank运算符需要括号,因为它的语法有点可疑:

a +⍤1 10 20 30 40    ⍝ ???
a(+⍤1)10 20 30 40    ⍝ maybe this?
a(+⍤1 10) 20 30 40   ⍝ or maybe this?
a(+⍤1 10 20) 30 40   ⍝ or even this?

IBM非常聪明,可以对排名运算符进行标准化,但不会实现它(至少在我的PC演示版APL2中)。