2016-03-02 13 views
6

Załóżmy, że mam funkcjęWektoryzacji funkcją na konkretnym argumentem

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

Chcę wektorować tylko drugi argument, tak, że mam coś takiego

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

Wiem, że istnieje makro @ vectorize_1arg lub @ vectorize_2arg. Jednak te makra będą wektoryzować wszystkie argumenty.

Pytanie: Jak wektoryzować funkcję dla konkretnego argumentu wygodnie? Czy muszę ciężko kodować jak powyższy przykład?

Odpowiedz

4

Jeśli szukasz rozszerzyć funkcje gdzie chcesz tylko drugi arg wektorowy, to powinien to zrobić:

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 

Używane tak:

@vectorize_on_2nd Int64 myfunc 

To powinno dać myfunc{N}(::Any, ::AbstractArray{Int64,N}) metoda.

+0

Dzięki! Ale nie działa w przypadku 'myfunc (2, 1:10)'. –

+0

Moje przeprosiny! Właśnie zredagowałem odpowiedź (zmieniając Array na AbstractArray). Proszę, idźcie jeszcze raz. –