量のさまざまな関数形式のライブラリを含むソフトウェアを作成しています。Julia の複数ディスパッチを活用したいのですが、この手順をより効率的に実装する方法があるかどうかを知りたいです。
たとえば、次の 2 つの関数を含むライブラリを考えてみます。
function firstfunction(x::Float64)
return 2*x
end
function secondfunction(x::Float64)
return x^2
end
また、これらの関数形式を値のベクトルまたはベクトルの配列 (行列) に適用できる複数のディスパッチ メソッドを実装したいと考えています。私は次のようにこれを行うことができます
function firstfunction(x::Float64)
return 2*x
end
function firstfunction(xs::Vector{Float64})
f = similar(xs)
for i = 1:size(xs, 1)
f[i] = 2*xs[i]
end
return f
end
function firstfunction(xss::Matrix{Float64})
f = similar(xss)
for i = 1:size(xss, 1)
for j = 1:size(xss, 2)
f[i, j] = 2*xss[i, j]
end
return f
end
function secondfunction(x::Float64)
return x^2
end
function secondfunction(xs::Vector{Float64})
f = similar(xs)
for i = 1:size(xs, 1)
f[i] = xs[i]^2
end
return f
end
function secondfunction(xss::Matrix{Float64})
f = similar(xss)
for i = 1:size(xss, 1)
for j = 1:size(xss, 2)
f[i, j] = xss[i, j]^2
end
return f
end
しかし、関数の 3 つのバージョンはすべて同じカーネルを使用し、さまざまなディスパッチのアクションはすべての関数形式で同じであるため、新しい関数を定義するようにこれを記述するより効率的な方法があるかどうかを知りたいです。ライブラリ (例: thirdfunction
) では、カーネル関数を明示的に記述するだけで済み、ライブラリ内の関数形式2*n
に対して本質的に同一の関数を入力する必要はありませんn
。