2016-03-02 11 views
6

Supponiamo che io abbia una funzioneVectorize una funzione su un argomento specifico

myfunc(a, x::Int64) = a * x 

voglio vettorizzare solo il secondo argomento, in modo da avere qualcosa di simile

myfunc{N}(a, x::Array{Int64, N}) = map(x -> myfunc(a, x), x) 

So che ci sono macro @ vectorize_1arg o @ vectorize_2arg. Tuttavia, tali macro vettorizzano tutti gli argomenti.

Domanda: Come rendere conveniente la funzione su un argomento specifico? Devo codice hard come nell'esempio sopra?

risposta

4

Se stai cercando di estendere le funzioni in cui si desidera solo la seconda vettorizzati arg, questo dovrebbe farlo:

macro vectorize_on_2nd(S, f) 
    S = esc(S); f = esc(f); N = esc(:N) 
    quote 
     ($f){$N}(a, x::AbstractArray{$S, $N}) = 
      reshape([($f)(a, x[i]) for i in eachindex(x)], size(x)) 
    end 
end 

usati in questo modo:

@vectorize_on_2nd Int64 myfunc 

Questo dovrebbe dare un myfunc{N}(::Any, ::AbstractArray{Int64,N}) metodo.

+0

Grazie! Ma non funziona nel caso "myfunc (2, 1:10)". –

+0

Le mie scuse! Ho appena modificato la risposta (cambiando la matrice in AbstractArray). Per favore, fallo un altro. –

Problemi correlati