2016-03-02 10 views
6

Angenommen, ich habe eine FunktionVectorize eine Funktion zu einem bestimmten Argument

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

Ich möchte nur das zweite Argument vektorisieren, so dass ich so etwas wie

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

Ich weiß, es Makro sind @ vectorize_1arg oder @ vectorize_2arg. Diese Makros vektorisieren jedoch alle Argumente.

Frage: Wie vektorisiert man die Funktion auf einem spezifischen Argument bequem? Muss ich hart codieren wie im obigen Beispiel?

Antwort

4

Wenn Sie suchen Funktionen zu erweitern, in dem Sie nur die zweite arg vektorisiert wollen, dies sollte es tun:

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 

Gebraucht wie folgt aus:

@vectorize_on_2nd Int64 myfunc 

, dass Sie sollten eine myfunc{N}(::Any, ::AbstractArray{Int64,N}) geben Methode.

+0

Danke! Aber es funktioniert nicht in dem Fall 'myfunc (2, 1:10)'. –

+0

Ich entschuldige mich! Ich habe gerade die Antwort bearbeitet (Array zu AbstractArray ändern). Bitte versuchen Sie es noch einmal. –

Verwandte Themen