根据Rosetta Code,在APL中有两种惯用的方法来创建单位矩阵:
1. ID←{∘.=/⍳¨ ⍵ ⍵}
2. ID←{⍵ ⍵ ρ 1, ⍵ρ0}
(2)如何运作?为什么这比使用在APL中被认为是惯用方法的外部产品的(1)更好?
答案 0 :(得分:6)
1,⍵⍴0
创建一个由1
后跟⍵
个零组成的向量。因此,此向量的长度为⍵+1
。
⍵ ⍵ ⍴
涵盖了⍵
- by - ⍵
矩阵。矢量的副本将从左到右和从上到下适合。第一个副本将覆盖整个第一行并溢出到第二行,例如⍵=5
:
1 0 0 0 0
0 . . . .
. . . . .
. . . . .
. . . . .
现在,第二个副本将在第二行稍微缩进:
. . . . .
. 1 0 0 0
0 0 . . .
. . . . .
. . . . .
依此类推,直到我们覆盖所有矩阵。它不一定是精确的封面,最后一个副本可能会被切断。如果你进一步想象这个过程,你可以看到1
- s将落在主对角线上。
我不知道为什么这应该比使用外部产品的方法更好。两者似乎都很好。
答案 1 :(得分:3)
如果比较两个表达式的表现,2显然胜出:
cmpx'{∘.=/⍳¨ ⍵ ⍵}1000' '{⍵ ⍵ ⍴ 1, ⍵⍴0}1000'
{∘.=/⍳¨ ⍵ ⍵}1000 → 2.4E¯3 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
* {⍵ ⍵ ⍴ 1, ⍵⍴0}1000 → 5.7E¯5 | -98% ⎕
如果你考虑解释器在处理这两个表达式时必须做什么,(2)的工作要少得多:将标量连接到vec并重新整形结果,而在(1)中它必须创建两个向量,建立一个具有相同比较的外部产品。此外,它涉及“每个”(有些人)不被视为“纯APL”...... 显然,如果你考虑两种算法实现的思想,(2)更好,更优雅。但那只是我的意见;)
答案 2 :(得分:3)
{⍵⍵⍴(⍵+ 1)↑1} ......快
{∘。=⍨⍳⍵} ......很好
)