在带有 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 ]
B
和 C
是完整矩阵,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
的稍小的网格上进行插值。
我有一些相对完整的观测数据,但在 matlab
的矩阵中包含一些 NaN 值,我想使用 interp2
[= 将它们插值到间隔更均匀的网格中18=]
所以,为了简单起见,假设我有一个完整的(没有 NaN 值)矩阵,并且看起来像这样:
A = [ 1 2 3 4;
2 3 2 NaN;
0 2 3 4;
0 NaN 4 5 ]
B
和 C
是完整矩阵,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
的稍小的网格上进行插值。