在矩阵中的 NaN 之间进行插值以绘制曲面图

问题描述 投票:0回答:1

我有一个传感器的测量结果,该传感器跨越了 41 个样本的频率扫描,我想将这些样本绘制在表面上。每个变量(频率、测量数据、浓度、活力)的矩阵尺寸为 41x100。每个样本的测量数据在不同位置都有多个 NaN 单元格。

我尝试在表面上绘制变量,但未能绘制 - 可能是由于 NaN 值。当 NaN 值位于不同的行和列中时,如何对它们进行插值(并可能进行推断)?下面是我的数据的简化版本,只有 2 个变量和插值问题。我可以根据要求提供有关其他 2 个变量和曲面图代码的更多详细信息。

我尝试使用缺失值,但由于频率是对数刻度,这为第 1 行中的 NaN 提供了非常高的值,我认为这是不准确的。

%Load variables
measured = [NaN NaN NaN NaN 3.1 2.2 2.6 1.5 5 5.3, 
-82 -63 -50 -36 NaN NaN -15 -5 -1 -1.5, 
73 73.4 69 66 49 NaN 36 30 30.4 NaN];

f= logspace(1,2,10);
f= repmat(f, 3,1);

%Identify NaNs
measured_nans = isnan(measured);

%Fill NaNs with nearby values
measured_fill = fillmissing (measured, "linear"); %Just showing what this looks like

%replace NaNs with interpolated values
measured_interp = interp1( f(measured_nans), measured(measured_nans), f(measured_nans) );

我还没想出合理的插值。使用 interp1,我收到错误:

使用 griddedInterpolant 时出错 样本点必须是唯一的。

interp1 F = griddedInterpolant(X,V(:,1),method) 中的错误

measured_interp 中的误差 = interp1(f(measured_nans),measured(measured_nans),f(measured_nans));

matlab interpolation nan
1个回答
0
投票

看起来您想在每一行上使用

interp1
。因此,必须在每一行上单独调用它。最简单的方法是使用 for 循环:

%Load variables
measured = ...
    [NaN NaN NaN NaN 3.1 2.2 2.6 1.5 5 5.3,
    -82 -63 -50 -36 NaN NaN -15 -5 -1 -1.5,
    73 73.4 69 66 49 NaN 36 30 30.4 NaN];

f=logspace(1,2,10);

%Identify NaNs
measured_nans = isnan(measured);

%Fill NaNs with nearby values
measured_fill = fillmissing (measured, "linear"); %Just showing what this looks like

%replace NaNs with interpolated values
measured_interp = measured;
for ii = 1:3
    measured_interp(ii,measured_nans(ii,:)) = ...
        interp1( f(~measured_nans(ii,:)), measured(ii,~measured_nans(ii,:)), f(measured_nans(ii,:)) );
end

需要注意的几点:

© www.soinside.com 2019 - 2024. All rights reserved.