我正在将一个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>
你能帮我解决这个问题吗?
谢谢!
答案 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")