4

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

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

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

4

3 回答 3

6
于 2013-05-06T06:51:23.097 回答
3

如果比较两个表达式的性能,2 显然胜出:

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

如果您考虑解释器在处理这两个表达式时必须做的事情,(2)的工作也少得多:将一个标量连接到一个 vec 并重塑结果,而在(1)中它必须创建两个向量,构建一个外部同等比较的产品。另外,它涉及到“每个”,这(某些人)不被认为是“纯 APL”......显然,如果您考虑两种算法实现的想法,(2)会更好,更优雅。但这只是我的意见;)

于 2013-05-06T06:57:57.797 回答
3

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

{∘.=⍨⍳⍵} ...不错

;)

于 2013-08-23T13:54:59.530 回答