【不连续有噪音的时间序列:2个setNaN子函数(3)】

不连续有噪音的时间序列:2个setNaN子函数(3)
思路:

  1. 原序列两端为nan的,最终光滑连续序列也为nan;
  2. 原序列中间连续缺失值大于给定阈值的,最终光滑连续序列该处也为nan;这个函数若报错要格外检查下尺寸对齐问题,目前我这里的案例全部核对过,运行良好。
  3. 比如我设定中间缺失大于30天,就设定为nan。

子函数代码

2个setNaN子函数分别如下:

  1. 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
  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值