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')
如何对等截面对应的向量进行线性插值?例如,我们有一个两列的矩阵,如下所示。
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')