4

量のさまざまな関数形式のライブラリを含むソフトウェアを作成しています。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

4

2 に答える 2