在带有 NaN 输入的 Matlab 中使用 interp2

Using interp2 in Matlab with NaN inputs

我有一些相对完整的观测数据,但在 matlab 的矩阵中包含一些 NaN 值,我想使用 interp2[= 将它们插值到间隔更均匀的网格中18=]

所以,为了简单起见,假设我有一个完整的(没有 NaN 值)矩阵,并且看起来像这样:

A = [ 1  2  3  4;
      2  3  2 NaN;
      0  2  3  4;
      0 NaN 4  5  ]

BC 是完整矩阵,interp2 不接受具有 NaN 值的输入矩阵。所以如果我这样做:

[AI,BI] = meshgrid(a,b) %# matrices to interpolate data to, arbitrary
CI = interp2(A,B,C,AI,BI) %# interpolation, A has NaN values

我得到一个错误:

Error using griddedInterpolant
The coordinates of the input points must be finite values; Inf and NaN are not permitted.

任何人都可以建议一个解决方案,或者合理的解决方案,而不妨碍我的数据吗?

抱歉,我在评论中给出的快速修复不能直接用于 2D 数据(它确实可以简单地使用 interp1 ,但是,如果你永远需要它).

对于网格化数据,如果您的网格中有 NaN,则您没有统一的网格,您不能直接使用 interp2。在这种情况下,您必须首先使用 griddata,在统一网格上重新插入数据(基本上修补漏洞)。

(1) 让我们展示一个受 Matlab 文档启发的示例:

%% // define a surface
[A,B] = meshgrid(-3:0.25:3);
C = peaks(A,B);

%// poke some holes in it (in every coordinate set)
A(15,3:8)   = NaN ;
B(14:18,13) = NaN ;
C(8,16:21)  = NaN ;

(2) 现在让我们在干净的网格上修复您的数据:

%// identify indices valid for the 3 matrix 
idxgood=~(isnan(A) | isnan(B) | isnan(C)); 

%// define a "uniform" grid without holes (same boundaries and sampling than original grid)
[AI,BI] = meshgrid(-3:0.25:3) ;

%// re-interpolate scattered data (only valid indices) over the "uniform" grid
CI = griddata( A(idxgood),B(idxgood),C(idxgood), AI, BI ) ;

(3) 一旦你的网格是统一的,你可以使用 interp2 如果你想在更精细的网格上进行网格划分,例如:

[XI,YI] = meshgrid(-3:0.1:3) ;   %// create finer grid
ZI = interp2( AI,BI,CI,XI,YI ) ; %// re-interpolate


但是,请注意,如果这就是您想要做的全部,您也可以仅使用 griddata,一步完成所有操作:

%// identify indices valid for the 3 matrix 
idxgood=~(isnan(A) | isnan(B) | isnan(C)); 

%// define a "uniform" grid without holes (finer grid than original grid)
[XI,YI] = meshgrid(-3:0.1:3) ;

%// re-interpolate scattered data (only valid indices) over the "uniform" grid
ZI = griddata( A(idxgood),B(idxgood),C(idxgood), XI, YI ) ;

这将生成与我们在上面的步骤 (3) 中获得的完全相同的网格和数据。


最后说明:如果您的 NaN 位于域的边界上,默认情况下这些函数不能 "interpolate" 这些边界的值。要强制他们这样做,请查看这些函数的 extrapolation 选项,或者简单地在边界上没有 NaN 的稍小的网格上进行插值。