2012-06-10 19 views
6

Come si può definire una funzione pervasiva in APL?Definire una funzione pervasiva in APL

Quello che faccio è

function←{ 
    (⊃⍣(⍬≡⍴⍵)){the function that apply to scalar}¨⍵ 
} 

penso che ci dovrebbe essere un modo migliore per fare questo che non sto vedendo.

risposta

3

La maggior parte delle funzioni primitive in APL sono già pervasive. Quindi, a meno che tu non faccia cose fantasiose, le tue funzioni personalizzate saranno già pervasive. Per esempio

f←{÷1+*-⍵} ⍝ sigmoid, f(x)=1/(1+exp(-x)) 

funzionerà su array e scalari.

Se si fare cose di fantasia e si dispone di una funzione non pervasiva f, è possibile trasformarlo in uno pervasiva da

g←{0=⍴⍴⍵:f⍵ ⋄ ∇¨⍵} ⍝ the pervasive version of f 

che può essere letto come: se l'argomento è uno scalare, applicare f su di esso, altrimenti ricorsivamente in ogni voce dell'argomento.

0

Il dfns workspace contiene il perv operator che provoca la sua funzione operando da applicare pervasively, sia con uno o due argomenti:

perv←{⍺←⊢    ⍝ Scalar pervasion 
    1=≡⍺ ⍵ ⍵:⍺ ⍺⍺ ⍵  ⍝ (⍺ and) ⍵ depth 0: operand fn application 
      ⍺ ∇¨⍵  ⍝ (⍺ or) ⍵ deeper: recursive traversal. 
} 

Try it online!

Problemi correlati