matlab中相应常数部分的插值

Interpolation for corresponding constant section in matlab

如何对等截面对应的向量进行线性插值?例如,我们有一个两列的矩阵,如下所示。

Matrix =
  125.2985    5.7057
  125.2991    5.7098
  125.2997    5.6880
  125.3004    5.6739
  125.3010    5.7140
  125.3016    6.0141
  125.3022    6.3620
  125.3029    6.4793
  125.3041    6.4665
  125.3047    6.4646
  125.3053    6.4844
  125.3060    6.4743
  125.3066    6.4865
  125.3072    6.4878
  125.3078    6.4975
  125.3085    6.4952
  125.3091    6.4958
  125.3128    6.5867
  125.3134    7.0733
  125.3141    7.3427
  125.3147    7.3238
  125.3153    7.3093
  125.3159    7.3188
  125.3166    7.3436

第二个矩阵为'C'。

C =
125.2985    2.0000
125.3004    3.0000
125.3053    5.0000
125.3085    4.0000
125.3147    6.0000
125.3166    7.0000 

现在我需要对 'Matrix(:,1)' 的 'C(:,2)' 值进行插值。线性插值的输出结果如下

Cinter=interp1(C(:,1),C(:,2),Matrix(:,1),'linear')


Cinter =

2.0000
2.3158
2.6316
3.0000
3.2449
3.4898
3.7347
4.0204
4.5102
4.7551
5.0000
4.7813
4.5937
4.4063
4.2187
4.0000
4.1935
5.3871
5.5806
5.8065
6.0000
6.3158
6.6316
7.0000

但我只想对 'Matrix(:,2)' 相当稳定的那些数据点进行插值。其余部分应与插值向量中的 NaN 相同。所需的输出应如下所示,而不是 'Cinter'。如何实现?

output1=
2.0000
2.3158
2.6316
3.0000
   NaN
   NaN
   NaN
   NaN
   NaN
   NaN
5.0000
4.7813
4.5937
4.4063
4.2187
4.0000
   NaN
   NaN
   NaN
   NaN
6.0000
6.3158
6.6316
7.0000

这也可以进一步实现第二个期望的输出。基于第一个 'output1' 个常量 'Matrix(:,2)' 的数据点 (NaN) 可以替换为附近的 'C(:,2) value'。第二个输出如下以及如何得到这个?

output2=
2.0000
2.3158
2.6316
3.0000
3.0000
   NaN
   NaN
5.0000
5.0000
5.0000
5.0000
4.7813
4.5937
4.4063
4.2187
4.0000
4.0000
4.0000
   NaN
6.0000
6.0000
6.3158
6.6316
7.0000

非常感谢。 最好的问候

要找到稳定区域,您可以估计导数(大概首先 and/or 第二,具体取决于您所说的 "stable" 的意思),然后 select 只有在某个范围内的导数;例如使用 gradient 作为一阶导数:

stable = abs(gradient(Matrix(:,2),Matrix(:,1))) < 50;
Cinter = NaN(size(Matrix,1),1);
Cinter(stable) = interp1(C(:,1),C(:,2),Matrix(stable,1),'linear')

如果您想保留左侧 右侧的低斜率的每个点,您可以尝试类似的方法:

grad = diff(Matrix(:,2)) ./ diff(Matrix(:,1));
leftgrad = [0; grad];
rightgrad = [grad; 0];
stable2 = abs(leftgrad) < 50 | abs(rightgrad) < 50;

然后您可以使用 stable2 而不是上面的 stable;如果你坚持选择最近点(而不是插值点)的值,为什么不这样做:

boundary = stable2 & not(stable);
Cinter(boundary) = interp1(C(:,1),C(:,2),Matrix(boundary,1),'nearest')