正确使用域外的Interpolations.jl

时间:2016-01-26 00:22:41

标签: 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,:)), interpolar_a);
            V_alturas(xx,yy,:) = interp1(squeeze(NivelAltura_int(xx,yy,:)),squeeze(V(xx,yy,:)), interpolar_a);
        end
    end
每当intrlar_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下添加它,我已经尝试过评估它,但它自然不会那样工作。< / p>

你能帮我解决这个问题吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

以下示例(refer)显示了extrapolate的工作原理:

准备:

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

现在我们使用extrapolat对象来控制外推行为:

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

因此,extrapolate对象的插值符合其父级,同时以自定义方式进行推断。

答案 1 :(得分:3)

看起来你可能会遇到两个问题。首先,最近有一些关于网格外推(#101)的工作可能还没有出现在标记版本中。如果你愿意生活在边缘,你可以//create character array ArrayList<Character> charArray = new ArrayList<Character>(); //convert string to Array for(int i = 0; i < countDigits(num); i++){ charArray.add(i, transferToArray.charAt(i)); } 使用开发版本(//create character array ArrayList<String> stringArray = new ArrayList<String>(); //convert string to Array for(int i = 0; i < countDigits(num); i++){ stringArray.add(i, ""+transferToArray.charAt(i)); } 会让你重新回到稳定版本。)

其次,对于矢量值网格外推(issue #24),看起来仍然缺少一种方法:

Pkg.checkout("Interpolations")

正如您所看到的,它正在尝试对所有抽象数组使用泛型定义,这当然会抛出边界错误。插值只需要添加自己的定义。

同时,你可以使用标量索引的理解:

Pkg.free("Interpolations")