Griddata 在 Matlab 中有不需要的插值

Griddata has unwanted interpolation in Matlab

我正在尝试在 MATLAB 中将数据从一个网格插入到另一个网格。第一个网格在 y 中间隔不均匀,而第二个则不是。当我执行插值时(使用 griddata),结果会在不存在数据的区域进行推断。

这是代码,以及插值前后的图。

输入变量:

Xin2 = [619000      619000      619000      619000      619000      619000
  621000      621000      621000      621000      621000      621000
  623000      623000      623000      623000      623000      623000
  625000      625000      625000      625000      625000      625000
  627000      627000      627000      627000      627000      627000
  629000      629000      629000      629000      629000      629000
  631000      631000      631000      631000      631000      631000
  633000      633000      633000      633000      633000      633000
  635000      635000      635000      635000      635000      635000
  637000      637000      637000      637000      637000      637000
  639000      639000      639000      639000      639000      639000
  641000      641000      641000      641000      641000      641000
  643000      643000      643000      643000      643000      643000
  645000      645000      645000      645000      645000      645000
  647000      647000      647000      647000      647000      647000
  649000      649000      649000      649000      649000      649000
  651000      651000      651000      651000      651000      651000
  653000      653000      653000      653000      653000      653000
  655000      655000      655000      655000      655000      655000
  657000      657000      657000      657000      657000      657000
  659000      659000      659000      659000      659000      659000];

Yin2 = [-688.38      -626.71      -568.39       -514.5      -465.64      -422.03
  -688.36      -626.64      -568.28      -514.35      -465.46      -421.82
  -688.32      -626.51      -568.07      -514.06       -465.1       -421.4
  -688.25      -626.31      -567.74      -513.61      -464.54      -420.75
   -688.2      -626.18      -567.53      -513.33      -464.19      -420.34
  -688.19      -626.13      -567.45      -513.23      -464.06      -420.19
  -688.14      -625.99      -567.22      -512.91      -463.67      -419.73
  -688.06      -625.74      -566.82      -512.37      -463.01      -418.95
  -688.01       -625.6      -566.59      -512.06      -462.61      -418.49
     -688      -625.57      -566.54      -511.99      -462.53       -418.4
  -687.13      -623.02       -562.4      -506.38      -455.59      -410.27
  -677.94       -595.9      -518.32      -446.64      -381.64      -323.64
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3];

Tempin2 = [0.74399        0.734      0.71456      0.68519      0.64358      0.58546
   0.7444      0.73442      0.71505      0.68578      0.64421      0.58598
   0.7446      0.73456      0.71517      0.68589      0.64428      0.58594
  0.74389       0.7338      0.71437      0.68505      0.64341      0.58507
  0.74176      0.73172      0.71234      0.68311      0.64166      0.58365
  0.73842      0.72847      0.70929      0.68033      0.63925      0.58175
  0.73554      0.72561      0.70641      0.67755      0.63666      0.57929
  0.73602      0.72568      0.70602      0.67671      0.63529      0.57718
  0.74297      0.73128       0.7101      0.67944      0.63682      0.57729
  0.75596      0.74156      0.71799      0.68532       0.6408      0.57963
  0.77081      0.75286      0.72441      0.68681      0.63783      0.57257
  0.77558      0.74655       0.7048      0.65198      0.58381      0.49389
  0.76412      0.73625      0.69626       0.6459      0.57968      0.49109
   0.7519      0.72508      0.68915      0.64346      0.58165      0.49733
  0.74398      0.72001      0.68661      0.64361      0.58471      0.50343
   0.7387        0.718      0.68708      0.64565      0.58851      0.50948
  0.73546      0.71749      0.68821      0.64767      0.59183      0.51471
  0.73255      0.71626      0.68831      0.64861      0.59397      0.51842
  0.72843      0.71274      0.68603      0.64778       0.5947      0.52053
  0.72166       0.7065      0.68148      0.64538      0.59429      0.52148
  0.71285      0.69917      0.67631      0.64259      0.59351      0.52205];

%And the code to make the interpolation variables and run the interpolation:

[X_i,Y_i]=meshgrid([Xin2(:,1)],[-700:5:-315]);
Temp_i=griddata(Xin2,Yin2,Tempin2,X_i,Y_i);

figure,pcolor(Xin2,Yin2,Tempin2), shading flat % original data
figure,pcolor(X_i,Y_i,Temp_i),shading flat %interpolated data

之前:

之后:

谁能解释外推数据的深蓝色三角形(从大约 (6.4e5,-325) 到 (6.2e5,-425) 的对角线连接),我该如何阻止它?

注意,我忘记为两个地块保持相同的 caxis;这对于说明不需要的插值发生在哪里并不重要。

发生这种情况是因为 griddata 根据定义不会外推, 但是 插值大致基于数据的凸包。如果您查看具有数据的输入值,凸包看起来与第二张图片中显示的结果相似。

这与对scatteredInterpolant使用none外推法是一样的。

No extrapolation. Any queries outside the convex hull of F.Points return NaN.

这里我显示了你的输入(Xin2Yin2)的黑色凸包(convhull)叠加在你的插值结果上。

K = convhull(Xin2, Yin2);
plot(Xin2(K), Yin2(K))

就如何防止这种情况而言,您只能在您知道在初始数据集边界内的点进行查询。至于 如何 做到这一点,您需要创建一些初始数据的轮廓并使用 inpolygon 测试每个查询点,然后只传递查询点 ( X_iY_i) 在此大纲内到 griddata.

要获得此大纲,您可以使用 gptoolbox 中的 ordered_outline 之类的东西。