Matrix APL中创建单位矩阵的最惯用方法

Matrix APL中创建单位矩阵的最惯用方法,matrix,apl,Matrix,Apl,根据,在APL中创建身份矩阵有两种惯用方法: 1. ID←{∘.=/⍳¨ ⍵ ⍵} 2. ID←{⍵ ⍵ ρ 1, ⍵ρ0} 这个(2)是如何工作的?为什么这比(1)更好,后者使用的外部产品在APL中被认为是惯用的方法,⍵⍴0创建一个向量,该向量由1后跟⍵零。所以,这个向量的长度是⍵+1 ⍵ ⍵ ⍴覆盖一个⍵-by-⍵矩阵。向量的副本将从左到右、从上到下进行拟合。第一份副本将覆盖整个第一行,并溢出到第二行,例如,⍵=5: 1 0 0 0 0 0 . . . . . . . . . . . .

根据,在APL中创建身份矩阵有两种惯用方法:

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

这个(2)是如何工作的?为什么这比(1)更好,后者使用的外部产品在APL中被认为是惯用的方法,⍵⍴0创建一个向量,该向量由
1
后跟
零。所以,这个向量的长度是
⍵+1

⍵ ⍵ ⍴覆盖一个
-by-
矩阵。向量的副本将从左到右、从上到下进行拟合。第一份副本将覆盖整个第一行,并溢出到第二行,例如,
⍵=5

1 0 0 0 0
0 . . . .
. . . . .
. . . . .
. . . . .
现在,第二份副本将在第二行有一点缩进:

. . . . .
. 1 0 0 0
0 0 . . .
. . . . .
. . . . .
依此类推,直到我们覆盖所有矩阵。这不一定是准确的封面,最后一份可能会被剪掉。如果进一步描述此过程,您可以看到
1
-s将落在主对角线上


我不知道为什么这是一个比使用外部产品更好的方法。两者都很好。

如果比较这两个表达式的性能,两个表达式显然是赢家:

cmpx'{∘.=/⍳¨ ⍵ ⍵}1000'  '{⍵ ⍵ ⍴ 1, ⍵⍴0}1000'       
  {∘.=/⍳¨ ⍵ ⍵}1000   → 2.4E¯3 |   0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
* {⍵ ⍵ ⍴ 1, ⍵⍴0}1000 → 5.7E¯5 | -98% ⎕                                       

如果你考虑解释器在处理这两个表达式时所要做的事情,(2)也远远不够:将一个标量连接到一个VEC并对结果进行整形,而在(1)它必须创建两个向量,建立一个具有相等的比较的外乘积。此外,它还涉及(某些人)不认为是“纯APL”的“每个”。。。 显然,如果你考虑一下这两种算法所实现的思想,(2)会更好、更优雅。但这只是我的意见;)

{⍵ ⍵⍴(⍵+1)↑1} ... 快速

{∘.=⍨⍳⍵} ... 好的


;)

顺便说一句,你问题中的“rho”是Unicode字符
U+03C1希腊小写字母rho
,而它应该是
U+2374 APL函数符号rho
。重塑方法可能被认为更好,因为它不涉及任何计算,而只是复制数据。