根據Rosetta Code創建單位矩陣的最習慣的方法,也有在APL創建單位矩陣兩種慣用方式:在APL
1. ID←{∘.=/⍳¨ ⍵ ⍵}
2. ID←{⍵ ⍵ ρ 1, ⍵ρ0}
怎樣的(2)工作?爲什麼這比使用外部產品的(1)更好,這種外部產品在APL中被認爲是習慣性的方法?
根據Rosetta Code創建單位矩陣的最習慣的方法,也有在APL創建單位矩陣兩種慣用方式:在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,⍵⍴0
創建一個向量,該向量由1
後跟⍵
零組成。所以,這個向量的長度是⍵+1
。
⍵ ⍵ ⍴
涵蓋了⍵
-012-矩陣。矢量的副本將從左到右和從上到下進行擬合。第一個副本將覆蓋整個第一行並溢出到第二行,例如爲⍵=5
:
1 0 0 0 0
0 . . . .
. . . . .
. . . . .
. . . . .
現在,第二個副本會在與第二排一點點縮進:
. . . . .
. 1 0 0 0
0 0 . . .
. . . . .
. . . . .
依此類推,直到我們覆蓋所有的矩陣。這不一定是確切的封面,最後的副本可能會被截斷。如果你進一步描述這個過程,你可以看到1
-s將落在主對角線上。
我不知道爲什麼這應該是一個比使用外部產品更好的方法。要麼看起來不錯。
{⍵⍵⍴(⍵+ 1)↑1} ...快
...好
{∘=⍨⍳⍵};)
順便說一句,在你的問題中的「rho」是Unicode字符'U + 03C1希臘小字母RHO',而它應該是'U + 2374 APL FUNCTIONAL SYMBOL RHO'。 – ngn 2013-05-06 06:57:53
重塑方法可能被認爲更好,因爲它不涉及任何計算,而只是複製數據。 – Lobachevsky 2015-03-30 14:58:05