MATLAB中fillmissing用movmean无法填充全部NaN的解决方法咨询
解决MATLAB fillmissing movmean模式小窗口残留NaN的问题
问题原因
当使用fillmissing的movmean模式时,填充逻辑是对每个NaN位置,取其滑动窗口内的非NaN数据计算均值。如果连续NaN区间的长度为L,当窗口大小W ≤ L时,NaN区间中间的部分无法通过窗口获取到任何非NaN数据,因此这些位置会残留NaN。只有当W > L时,窗口才能覆盖到NaN区间两端的有效数据,从而完成全填充。
无需增大窗口的解决方案
可以采用混合填充策略:先用小窗口的movmean填充大部分可覆盖的NaN,再用其他插值方法(如线性插值)处理残留的NaN,这样既能保留movmean平滑的优势,又能避免窗口过大带来的过度平滑。
示例代码:
signal = rand(10000, 1); signal(500:700) = NaN; % 第一步:用小窗口movmean填充大部分NaN signalInterpolate = fillmissing(signal, "movmean", 50); % 第二步:用线性插值处理残留的NaN signalInterpolate = fillmissing(signalInterpolate, "linear"); sum(isnan(signalInterpolate)) % 输出为0,无残留NaN
你也可以根据信号特性选择其他插值方式,比如nearest(最近邻)、spline(样条插值)等,替换第二步的"linear"即可。
补充说明
如果希望全程使用movmean逻辑,也可以先对NaN区间的边缘做临时填充(比如用最近邻填充少量点),再用小窗口movmean,最后修正边缘,但混合填充的方式更简洁高效。
内容的提问来源于stack exchange,提问作者Xin Niu
相关产品推荐
相关产品推荐

