Я пытаюсь изучить синтаксис точечной векторизации Джулии на очень простом примере линейного интерполирующего сплайна.
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])
?
Я бросаю точки везде и никуда и не совсем уверен, как проверить, могу ли я Я захватываю все, сохраняя при этом гибкость вещания, которую должна сохранять точечная нотация.