在APL

2013-05-05 48 views
3

根據Rosetta Code創建單位矩陣的最習慣的方法,也有在APL創建單位矩陣兩種慣用方式:在APL

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

怎樣的(2)工作?爲什麼這比使用外部產品的(1)更好,這種外部產品在APL中被認爲是習慣性的方法?

回答

3

如果你比較兩個表達式的性能,2明顯勝出:

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

如果你考慮一下解釋具有處理兩個表達式時做的,(2)也遠不如工作:鏈狀一個對vec的標量並重塑結果,而(1)它必須創建兩個向量,用相等比較來構建一個外部產品。再加上它涉及到的「每個」(有些人)不被認爲是「純APL」......當然,如果你考慮兩種算法實現的想法,(2)更好,更優雅。但是,這只是我的意見;)

5

1,⍵⍴0創建一個向量,該向量由1後跟零組成。所以,這個向量的長度是⍵+1

⍵ ⍵ ⍴涵蓋了-012-矩陣。矢量的副本將從左到右和從上到下進行擬合。第一個副本將覆蓋整個第一行並溢出到第二行,例如爲⍵=5

1 0 0 0 0 
0 . . . . 
. . . . . 
. . . . . 
. . . . . 

現在,第二個副本會在與第二排一點點縮進:

. . . . . 
. 1 0 0 0 
0 0 . . . 
. . . . . 
. . . . . 

依此類推,直到我們覆蓋所有的矩陣。這不一定是確切的封面,最後的副本可能會被截斷。如果你進一步描述這個過程,你可以看到1 -s將落在主對角線上。

我不知道爲什麼這應該是一個比使用外部產品更好的方法。要麼看起來不錯。

+0

順便說一句,在你的問題中的「rho」是Unicode字符'U + 03C1希臘小字母RHO',而它應該是'U + 2374 APL FUNCTIONAL SYMBOL RHO'。 – ngn 2013-05-06 06:57:53

+0

重塑方法可能被認爲更好,因爲它不涉及任何計算,而只是複製數據。 – Lobachevsky 2015-03-30 14:58:05

2

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

...好

{∘=⍨⍳⍵};)