Julia 域外插值.jl的正确使用
我正在将一个Matlab代码移植到julia中,到目前为止,我得到了惊人的结果: 一个在Matlab中运行超过5小时的代码,julia在8分钟多一点的时间内就完成了!但是我有一个问题。。。 在matlab中,我有:Julia 域外插值.jl的正确使用,julia,Julia,我正在将一个Matlab代码移植到julia中,到目前为止,我得到了惊人的结果: 一个在Matlab中运行超过5小时的代码,julia在8分钟多一点的时间内就完成了!但是我有一个问题。。。 在matlab中,我有: for xx=1:xlong for yy = 1:ylong U_alturas(xx,yy,:) = interp1(squeeze(NivelAltura_int(xx,yy,:)),squeeze(U(xx,yy,:)), in
for xx=1:xlong
for yy = 1:ylong
U_alturas(xx,yy,:) = interp1(squeeze(NivelAltura_int(xx,yy,:)),squeeze(U(xx,yy,:)), interpolar_a);
V_alturas(xx,yy,:) = interp1(squeeze(NivelAltura_int(xx,yy,:)),squeeze(V(xx,yy,:)), interpolar_a);
end
end
每当极间a的一个点超出NivelAltura_int的范围时,就会产生NaN
在《朱莉娅》中,我也尝试着这样做:
for xx in 1:xlong
for yy in 1:ylong
AltInterp = interpolate((Znw_r,),A_s_c_r,Gridded(Linear()));
NivelAltura_int[xx,yy,1:end] = AltInterp[Znu[1:end]]
Uinterp = interpolate((squeeze(NivelAltura_int[xx,yy,1:end],(1,2)),),squeeze(U[xx,yy,1:end],(1,2)),Gridded(Linear()));
Vinterp = interpolate((squeeze(NivelAltura_int[xx,yy,1:end],(1,2)),),squeeze(V[xx,yy,1:end],(1,2)),Gridded(Linear()));
U_alturas[xx,yy,1:end] = Uinterp[Alturas[1:end]];
V_alturas[xx,yy,1:end] = Vinterp[Alturas[1:end]];
end
end
使用包Interpolations.jl。每当该点位于域之外时,该包就会进行推断,这对于我来说是不正确的。
我可以添加几行代码来检查域外的值,并用NaN替换这些值,但我相信这会给计算增加一些时间,而且不是很优雅
在包的文档中,它提到了一种对象,如下所示:
Uextrap = extrapolate(Uinterp,NaN)
为了控制域外的行为,但我还没有找到如何使用它,我尝试在Uinterp下添加它,我尝试评估它,但它自然不会那样工作
你能帮我做这个吗
谢谢 以下示例()显示了推断的工作原理:
准备:
using Interpolations
f(x) = sin((x-3)*2pi/9 - 1)
xmax = 10
A = Float64[f(x) for x in 1:xmax] # domain .EQ. 1:10
itpg = interpolate(A, BSpline(Linear()), OnGrid())
itpg
对象外推符合其插值类型的外部点:
itpg[2] # inside => -0.99190379965505
itpg[-2] # outside => 0.2628561875219271
现在我们使用extraction
对象来控制外推行为:
etpg = extrapolate(itpg, NaN);
etpg[2]==itpg[2] # same result when point is inside => true
isnan(etpg[-2]) # NaN when the point is outside => true
因此,外推
对象在以自定义方式进行外推时会执行符合其父对象的插值。看起来您可能会遇到两个问题。首先,最近有一些关于网格外推法()的工作,这些工作可能还不在标记版本中。如果你愿意生活在边缘,你可以Pkg.checkout(“Interpolations”)
使用开发版本(Pkg.free(“Interpolations”)
会让你重新回到稳定版本)
其次,向量值网格外推()似乎仍然缺少一种方法:
如您所见,它试图对所有抽象数组使用通用定义,这当然会引发边界错误。插值只需要添加自己的定义
同时,您可以将理解与标量索引结合使用:
julia> [etp[x] for x=.5:1:10.5]
11-element Array{Any,1}:
NaN
0.15
0.25
0.35
0.45
0.55
0.65
0.75
0.85
0.95
NaN
julia> [etp[x] for x=.5:1:10.5]
11-element Array{Any,1}:
NaN
0.15
0.25
0.35
0.45
0.55
0.65
0.75
0.85
0.95
NaN