Chr*_*don 2 matlab interpolation matrix
我有一些相对完整的观测数据,但在矩阵中包含一些 NaN 值,matlab我想使用它们将它们插值到更均匀间隔的网格interp2
因此,为了简单起见,假设我有一个完整的(无 NaN 值)矩阵,以及一个看起来像这样的矩阵:
A = [ 1 2 3 4;
2 3 2 NaN;
0 2 3 4;
0 NaN 4 5 ]
Run Code Online (Sandbox Code Playgroud)
作为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
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Error using griddedInterpolant
The coordinates of the input points must be finite values; Inf and NaN are not permitted.
Run Code Online (Sandbox Code Playgroud)
任何人都可以提出不妨碍我的数据的解决方案或合理的解决方法吗?
抱歉,我在评论中给出的快速修复不能直接适用于 2D 数据(如果您需要的话,它确实可以简单地使用 )。interp1
对于网格数据,如果你NaN的网格中有s,那么你就没有统一的网格,你不能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 ;
Run Code Online (Sandbox Code Playgroud)

(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 ) ;
Run Code Online (Sandbox Code Playgroud)

(3) 一旦网格统一,interp2如果您想在更精细的网格上划分网格,则可以使用,例如:
[XI,YI] = meshgrid(-3:0.1:3) ; %// create finer grid
ZI = interp2( AI,BI,CI,XI,YI ) ; %// re-interpolate
Run Code Online (Sandbox Code Playgroud)

但是,请注意,如果这就是您想要做的全部事情,您也可以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 ) ;
Run Code Online (Sandbox Code Playgroud)
这会产生与我们在上面步骤 (3) 中获得的完全相同的网格和数据。
最后注意事项:如果您的NaNs 位于域的边界上,默认情况下这些函数无法“插入”这些边界的值。要强制它们这样做,请查看extrapolation这些函数的选项,或者简单地在没有NaN边框的稍小的网格上进行插值。