2016-03-02 27 views
6

Ben bir işlevi olduğunu varsayalımVectorize

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

Ben

ben makro vardır biliyor
myfunc{N}(a, x::Array{Int64, N}) = map(x -> myfunc(a, x), x) 

gibi bir şey var ki ben, yalnızca ikinci argümanı vektörize istiyorum @ belirli argüman üzerinde bir işlev vectorize_1arg veya @ vectorize_2arg. Ancak, bu makrolar tüm argümanları vectorize edecektir.

Soru: Belirli bir bağımsız değişken üzerinde işlevi nasıl uygun hale getirebiliriz? Yukarıdaki örnekte olduğu gibi kod yazmalı mıyım? Eğer sadece ikinci arg vectorized istediğiniz işlevleri uzatmak arıyorsanız

cevap

4

, bunu yapmak gerekir:

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 

böyle Kullanılan:

@vectorize_on_2nd Int64 myfunc 

size myfunc{N}(::Any, ::AbstractArray{Int64,N}) vermelidir O yöntem.

+0

Teşekkürler! Ama bu durumda çalışmaz (myfunc (2, 1:10) '). –

+0

Özür dilerim! Ben sadece cevabı düzenledim (Array öğesini AbstractArray olarak değiştirdim). Lütfen başka bir tane al. –