在APL中创建单一矩阵的最惯用的方法

时间:2013-05-05 14:55:28

标签: matrix apl

根据Rosetta Code,在APL中有两种惯用的方法来创建单位矩阵:

1. ID←{∘.=/⍳¨ ⍵ ⍵}
2. ID←{⍵ ⍵ ρ 1, ⍵ρ0}

(2)如何运作?为什么这比使用在APL中被认为是惯用方法的外部产品的(1)更好?

3 个答案:

答案 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} ......快

{∘。=⍨⍳⍵} ......很好