gpt4 book ai didi

matlab - 如何在 MatLab 中使用 TriScatteredInterp?

转载 作者:行者123 更新时间:2023-12-04 06:10:52 25 4
gpt4 key购买 nike

我在 MatLab 中遇到 TriScatteredInterp 的问题。
我在该位置使用了一组具有相应温度的坐标点。它们都以度为单位(long、lat、temp)。我想对这些点进行插值,以便我可以找出其他点的值并构建网格。
这是我到目前为止所做的:

long = data(:,1)
lat = data(:,2)
values = data(:,3)
lat = lat.*(pi/180)
long = long.*(pi/180)
X = cos(lat).*cos(long)
Y = cos(lat).*sin(long)
Z = sin(lat)
F = TriScatteredInterp(X,Y,Z,values)
[long1 lat1] = meshgrid(-pi:pi/360:pi, -pi/2:pi/360:pi/2);
X1 = cos(lat1).*cos(long1)
Y1 = cos(lat1).*sin(long1)
Z1 = sin(lat1);
F.Method = 'natural'
InterpVals = F(X1,Y1,Z1);
mesh(long1, lat1, InterpVals)

如您所见,对于每个(长、纬度)点,我已经计算了球体上的相应点并使用了 TriScatteredInterp 的 3d 版本。
问题是插值仅适用于“最近”方法,因为线性或自然只产生 NaN。正如我所读到的,当我想要插值的点在三角剖分的凸包之外时会发生这种情况,但由于所需的点正好在球体上,并且输入点覆盖了整个范围(长:-180 到180,纬度:-90 到 90),我只是不明白所有的点怎么会在凸包之外。任何帮助将不胜感激,ty。

最佳答案

您应该在二维原始数据(long、lat)上插入值,而不是在三维数据(X、Y、Z)上插入值。
请注意,我包含了一些虚拟数据生成器,供无法访问您的 data() 的读者使用!

n = 100;
long = rand(n,1)*720-360;
lat = rand(n,1)*180-90;
values = rand(n,1)*30-5;
lat = lat.*(pi/180);
long = long.*(pi/180);

F = TriScatteredInterp(long,lat,values);
[long1 lat1] = meshgrid(-pi:pi/36:pi, -pi/2:pi/24:pi/2);
InterpVals = F(long1,lat1);

X1 = cos(lat1).*cos(long1);
Y1 = cos(lat1).*sin(long1);
Z1 = sin(lat1);
mesh(X1,Y1,Z1,InterpVals); %note here the meshing on the regular grid (X1,Y1,Z1)

map 边缘仍然存在问题,因为插值器不知道数据“环绕”。这些边上的 InterpVals 的内容将是.. NaN!

编辑:包装建议:
1) 重写 TriScatteredInterp 使其使用模数;
2)镜像 map “边缘”周围的数据,插值,然后将其裁剪回原始大小;
3)查看Matlab Mapping Toolbox,它可以分析和可视化地理信息。

关于matlab - 如何在 MatLab 中使用 TriScatteredInterp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7794337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com