【发布时间】:2018-02-08 14:26:08
【问题描述】:
几年前,我在大型机上偷看了 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 的那个人(他已经退休但仍然接听电话)并询问第二个解决方案,他立刻想起了我在说什么。
新的 APL2 方法更加简洁、简洁和一致,这些示例将由 a+[2] 10 20 30 40 和 a+[1] 10 20 30 40 解决。凉爽的。它在 Dyalog 中有效。
快进十年或更长时间,我发现有一个新事物叫做排名运算符。第一个例子可以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,它没有抓住重点,违背了整个目的。
为什么秩运算符比轴表示法更可取?哪个更好”? (可以肯定的是,这是一个加载的术语)乍一看,轴符号对我这个鞋码智商的人来说很容易掌握。对于排名运算符,我不能说同样的话。
【问题讨论】: