几年前我在大型机上偷看了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 40
和a+[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;? (一个负载的术语,可以肯定)乍一看,轴标记对我来说非常容易,一个鞋子大小智商的人,要掌握。对于排名运算符,我无法说同样的话。
答案 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
答案 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中)。