Rosetta Codeによると、APL で恒等行列を作成するには 2 つの慣用的な方法があります。
1. ID←{∘.=/⍳¨ ⍵ ⍵}
2. ID←{⍵ ⍵ ρ 1, ⍵ρ0}
(2)はどのように機能しますか?APLで慣用的なアプローチと考えられている外積を使用する(1)よりも優れているのはなぜですか?
Rosetta Codeによると、APL で恒等行列を作成するには 2 つの慣用的な方法があります。
1. ID←{∘.=/⍳¨ ⍵ ⍵}
2. ID←{⍵ ⍵ ρ 1, ⍵ρ0}
(2)はどのように機能しますか?APLで慣用的なアプローチと考えられている外積を使用する(1)よりも優れているのはなぜですか?
{⍵ ⍵⍴(⍵+1)↑1} ... 速い
{∘.=⍨⍳⍵} ...いいですね
;)
2 つの式のパフォーマンスを比較すると、明らかに 2 の方が優れています。
cmpx'{∘.=/⍳¨ ⍵ ⍵}1000' '{⍵ ⍵ ⍴ 1, ⍵⍴0}1000'
{∘.=/⍳¨ ⍵ ⍵}1000 → 2.4E¯3 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕
* {⍵ ⍵ ⍴ 1, ⍵⍴0}1000 → 5.7E¯5 | -98% ⎕
2 つの式を処理するときにインタープリターが何をしなければならないかを考えると、(2) もはるかに少ない作業です。スカラーを vec に連結し、結果を再形成しますが、(1) では 2 つのベクトルを作成し、外部を構築する必要があります。同等の製品。さらに、「純粋な APL」とは見なされていない「each」が含まれています...そして、2 つのアルゴリズムによって実装されたアイデアについて考えると、明らかに (2) の方がはるかに優れていてエレガントです。しかし、それは私の意見です;)