2016-03-02 8 views
6

上の機能は、私は関数にベクタライズ特定の引数

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

があると私は

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

のようなものを持っているように、私はマクロがある知っている、唯一の第二引数をベクトル化したいです@ vectorize_1argまたは@ vectorize_2arg。 しかし、それらのマクロはすべての引数をベクトル化します。

質問:特定の引数で関数を便利にベクトル化するにはどうすればよいですか?上記の例のようにハードコードする必要がありますか?

答えて

4

あなたが唯一の第二引数のベクトル化をしたい機能を拡張するために探しているなら、これはそれを行う必要があります。

このように使用
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 

あなた myfunc{N}(::Any, ::AbstractArray{Int64,N})を与える必要があります
@vectorize_on_2nd Int64 myfunc 

方法。

+0

ありがとうございます!しかし、 'myfunc(2、1:10)'の場合は動作しません。 –

+0

私の謝罪!私は答えを編集しました(ArrayをAbstractArrayに変更する)。それを別のものにしてください。 –

関連する問題