Julia dot向量化-我需要向量化到呼叫链的多深?
我试图用一个非常简单的线性插值样条曲线的例子来研究Julia的点矢量化语法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
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分配”,你肯定很好。也很容易使用。