几年前我在主机上偷看了APL2,并记得为向矩阵添加矢量的问题展示了解决方案.
鉴于a?4 4 ? ?16和?io?1
向行添加向量的旧方法就像
a+(?a)?10 20 30 40
Run Code Online (Sandbox Code Playgroud)
导致
11 22 33 44
15 26 37 48
19 30 41 52
23 34 45 56
Run Code Online (Sandbox Code Playgroud)
并将向量添加到矩阵的列中
a+(4 1?10 20 30 40)[;1 1 1 1]
Run Code Online (Sandbox Code Playgroud)
或者,如果您愿意,
a+4/4 1?10 20 30 40
Run Code Online (Sandbox Code Playgroud)
导致
11 12 13 14
25 26 27 28
39 40 41 42
53 54 55 56
Run Code Online (Sandbox Code Playgroud)
幸运的是,我能够打电话给那天给我看APL2的那个人(他已经退休但仍然接听了他的电话)并询问了第二个解决方案,他立即记得我在说什么.
新的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使用秩运算符的第二个例子并没有直接(至少对我来说)类似.我不能说我理解它,但在我看来,秩操作员通过折叠其尺寸同时保留内容完整而"重新投射"其左参数.太多年的C++和Java影响了我对事物的思考方式.
是否有a+[1] 10 20 30 40使用秩运算符的简单解决方案?到目前为止?(?a)(+?1) 10 20 30 40,我发现的唯一想法是忽略了这一点并击败了整个目的.
为什么秩操作符优于轴符号?哪个更好"?(一个负载的术语,可以肯定)乍一看,轴标记对我来说非常容易,一个鞋子大小智商的人,要掌握.对于排名运营商,我不能说同样的话.
a+[1] 10 20 30 40使用秩运算符的简单解决方案?是的:a(+?1 0)10 20 30 40 在线尝试!
对于二元应用,秩运算符实际上需要一个双元素右操作数(但接受一个单例,它扩展到两个元素).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数组应该被添加到10 20 30 40(整个向量)的rank-1数组中.这里,a(+?1 0)10 20 30 40表示a应该将(行)的rank-1数组添加到10 20 30 40(scalars)的rank-0数组中.
秩运算符允许您完全控制从每个参数中获取的内容,而括号轴表示法仅允许您扩展较低级别的参数.秩运算符是语言的集成部分,可以与任何函数一起使用,甚至可以与用户定义的函数一起使用,而括号轴表示法只能与二元标量函数,约简和混合函数的一小部分一起使用.
由于秩运算符遵循运算符的常规APL语法并且普遍适用,因此它减少了要记住的规则数量.此外,秩操作符还允许通过使用负数来指定相对等级.因此,虽然?1平均值适用于等级1的子阵列,但?¯1意味着适用于比整个参数小一级的子阵列.在我看来,这足以安全地考虑秩操作符"比支架轴更好".
我个人不喜欢括号,所以我得到你来自哪里.幸运的是,您可以随时减少括号的数量.括号的唯一原因a(+?1)10 20 30 40是将数组操作数1与数组参数分开10 20 30 40.任何其他分离它们的方式也是可以接受的,我通常使用身份功能?:a+?1?10 20 30 40 在线尝试!
但是,您也可以将正确的操作数调整为二元运算符,产生monadic运算符,这些运算符读得非常好:horizontally??1 0 ? vertically??1 1 在线尝试!