Julia dot向量化-我需要向量化到呼叫链的多深?

Julia dot向量化-我需要向量化到呼叫链的多深?,julia,vectorization,Julia,Vectorization,我试图用一个非常简单的线性插值样条曲线的例子来研究Julia的点矢量化语法 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, di

我试图用一个非常简单的线性插值样条曲线的例子来研究Julia的点矢量化语法

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()
我需要在调用链的多深处使用点符号来确保我对
interpolator.(x)
main()
调用被解释器完全矢量化

  • createlookup
    是否需要任何矢量化
  • linear\u dydx
    是否已通过
    diff
    进行矢量化
  • 我需要
    @.
    y=y前面吗ₖ[i] +dydxₖ[i] *(x-x)ₖ[i] )

我发现自己到处乱扔点,不知道如何检查自己是否捕获了所有内容,同时仍然保持点表示法应该保持的广播灵活性。

要记住的一般策略是,如果有意义的话,将所有函数都写为标量函数。一旦编写了标量操作,就可以使用
一次将它们应用于数组。

这似乎已经奏效,至少在功能上是这样。我是否可以使用分析工具来确保单个矢量化按预期进行?你说的“按预期进行”是什么意思?进行了优化(例如最小化临时数组等)
@profile
@profview
中的
@profview
可能会有所帮助。也就是说,如果您只进行一次广播,您将只获得1个阵列分配(如果您预先分配了输出,则为0)。您还可以使用BenchmarkTools.jl(您基本上应该将其用于所有基准测试)。它将告诉您分配的数量和大小。如果上面写着“1分配”,你肯定很好。也很容易使用。