Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia 域外插值.jl的正确使用_Julia - Fatal编程技术网

Julia 域外插值.jl的正确使用

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

我正在将一个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,:)), 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