根据 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) 会更好、更优雅。但这只是我的意见;)
关于matrix - 在APL中创建单位矩阵的最惯用的方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16385783/