Юлия точечная векторизация - насколько глубоко в цепочке вызовов мне нужно векторизовать? - PullRequest
2 голосов
/ 26 мая 2020

Я пытаюсь изучить синтаксис точечной векторизации Джулии на очень простом примере линейного интерполирующего сплайна.

function createlookup(xk)
    min_i = 1
    max_i = size(xk, 1) - 1
    function inner(x)
        max(min(searchsorted(xk, x).stop, max_i), min_i)
    end
    inner
end


function linear_dydx(x, y)
    diff(y, dims=1) ./ diff(x, dims=1)
end


function linear(xₖ, yₖ)
    segment = createlookup(xₖ)
    dydxₖ = linear_dydx(xₖ, yₖ)
    function inner(x)
        i = segment(x)
        y = yₖ[i] + dydxₖ[i] * (x - xₖ[i])
    end
    inner
end


function main()
    xₖ = [0.0, 1.0, 2.0, 4.0]
    yₖ = [0.0, 2.0, 10.0, 13.0]
    interpolator = linear(xₖ, yₖ)

    x = [i/2.0 for i=0:10]

    println(interpolator(2.43))
    println(interpolator.(x))
end

main()

Насколько глубоко в цепочке вызовов мне нужно использовать точечную нотацию, чтобы убедиться мой main() вызов interpolator.(x) полностью векторизован интерпретатором?

  • Нужна ли createlookup векторизация?
  • linear_dydx уже векторизован через diff и ./?
  • Нужно ли мне @. перед y = yₖ[i] + dydxₖ[i] * (x - xₖ[i])?

Я бросаю точки везде и никуда и не совсем уверен, как проверить, могу ли я Я захватываю все, сохраняя при этом гибкость вещания, которую должна сохранять точечная нотация.

1 Ответ

3 голосов
/ 26 мая 2020

Общая стратегия, о которой следует помнить, - писать все свои функции как скалярные, если это имеет смысл. После того, как вы написали свои скалярные операции, вы можете применить их к массиву, используя . один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...