根据Rosetta Code,在 APL 中创建单位矩阵有两种惯用方式:
1. ID←{∘.=/⍳¨ ⍵ ⍵}
2. ID←{⍵ ⍵ ρ 1, ⍵ρ0}
(2) 是如何工作的?为什么这比(1)更好,它使用在 APL 中被认为是惯用方法的外部产品?
根据Rosetta Code,在 APL 中创建单位矩阵有两种惯用方式:
1. ID←{∘.=/⍳¨ ⍵ ⍵}
2. ID←{⍵ ⍵ ρ 1, ⍵ρ0}
(2) 是如何工作的?为什么这比(1)更好,它使用在 APL 中被认为是惯用方法的外部产品?
如果比较两个表达式的性能,2 显然胜出:
cmpx'{∘.=/⍳¨ ⍵ ⍵}1000' '{⍵ ⍵ ⍴ 1, ⍵⍴0}1000'
{∘.=/⍳¨ ⍵ ⍵}1000 → 2.4E¯3 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
* {⍵ ⍵ ⍴ 1, ⍵⍴0}1000 → 5.7E¯5 | -98% ⎕
如果您考虑解释器在处理这两个表达式时必须做的事情,(2)的工作也少得多:将一个标量连接到一个 vec 并重塑结果,而在(1)中它必须创建两个向量,构建一个外部同等比较的产品。另外,它涉及到“每个”,这(某些人)不被认为是“纯 APL”......显然,如果您考虑两种算法实现的想法,(2)会更好,更优雅。但这只是我的意见;)
{⍵ ⍵⍴(⍵+1)↑1} ... 快
{∘.=⍨⍳⍵} ...不错
;)