不连续有噪音的时间序列:2个setNaN子函数(3)
思路:
- 原序列两端为nan的,最终光滑连续序列也为nan;
- 原序列中间连续缺失值大于给定阈值的,最终光滑连续序列该处也为nan;这个函数若报错要格外检查下尺寸对齐问题,目前我这里的案例全部核对过,运行良好。
- 比如我设定中间缺失大于30天,就设定为nan。
子函数代码
2个setNaN子函数分别如下:
- setNaN_edge.m
function y_smooth= setNaN_edge(y,y_smooth)
% Step 5: 恢复两端nan值
% 找到原始数据中的NaN位置
nan_indices = ~isnan(y);
% 获取两端的NaN位置
left_nan_indices = find(nan_indices, 1, 'first'); % 第一个NaN位置
right_nan_indices = find(nan_indices, 1, 'last'); % 最后一个NaN位置
% 只还原两端的NaN
y_smooth(1:left_nan_indices-1) = NaN;
y_smooth(right_nan_indices+1:end) = NaN;
end
- setNaN_center.m
function y_smooth= setNaN_center(y,y_smooth,missing_thresh)
% Step 5: 恢复中心nan值
% 找到原始数据中的NaN位置
nan_indices = isnan(y);
nan_diff=[0;diff(nan_indices)];
run_starts = find(nan_diff == 1);
run_ends = find(nan_diff == -1) -1;
run_num=length(run_starts)-length(run_ends);
% 这里注意尺寸变化及对应关系
if run_num==0
run_starts(end,:)=[];
run_ends(1,:)=[];
elseif run_num==-1
run_ends(1,:)=[];
elseif run_num==1
run_starts(end,:)=[];
end
missing_num = run_ends - run_starts + 1;
% 恢复超过阈值的中间连续缺失值
for i = 1:length(run_starts)
if missing_num(i) > missing_thresh
y_smooth(run_starts(i):run_ends(i)) = NaN;
disp(['i = ', num2str(i)]);
end
end
end