MATLAB的fillmissing函数提供五种缺失值填充方法:一、线性插值法;二、前向/后向填充法;三、移动窗口均值法;四、自定义函数法;五、基于邻近行匹配法,各适用于不同数据特征与业务场景。

当表格数据中存在NaN值时,可能导致后续分析失败或结果失真。MATLAB的fillmissing函数提供多种内置策略自动填充缺失值。以下是使用该函数进行智能填充的具体方法:
一、使用线性插值法填充
线性插值适用于数值型列,假设数据随索引呈近似线性变化,利用相邻非缺失值之间的比例关系估算NaN位置的值。
1、读取包含NaN的表格数据,例如使用T = readtable('data.csv');
2、对指定数值列(如'Height')调用fillmissing,设置方法为'linear':T.Height = fillmissing(T.Height, 'linear');
3、若需批量处理所有数值列,可结合varfun与@isnumeric筛选后应用:T = varfun(@(x)fillmissing(x,'linear'), T, 'InputVariables', @isnumeric);
二、使用前向/后向填充法
前向填充('previous')用最近的前方有效值替代NaN,适合时间序列中缺失发生在突发中断后的场景;后向填充('next')则相反,适用于末尾缺失或趋势延续情形。
1、对时间列按时间顺序排序,确保T.Time为datetime类型并已排序:T = sortrows(T, 'Time');
2、执行前向填充:T.Value = fillmissing(T.Value, 'previous');
3、执行后向填充:T.Value = fillmissing(T.Value, 'next');
4、注意:前向/后向法不适用于含大量连续NaN的列,否则会引发长距离无效复制;
三、使用移动窗口均值填充
移动窗口均值法在每个NaN位置周围选取固定长度窗口,计算其中非NaN值的平均数作为填充依据,能抑制异常值干扰并保留局部趋势特征。
1、确定窗口大小,例如取5个样本:window = 5;
2、调用fillmissing并指定'movingmean'及窗口参数:T.Data = fillmissing(T.Data, 'movingmean', window);
3、若窗口内无足够非NaN值,函数默认返回NaN,此时可叠加'EndValues'选项指定边界处理方式:T.Data = fillmissing(T.Data, 'movingmean', window, 'EndValues', 'nearest');
四、使用自定义函数填充
当内置方法无法满足业务逻辑时,可编写匿名函数或外部函数,例如按同一分组的中位数填充,以消除组间差异影响。
1、创建分组变量,如按'Category'列分组:G = findgroups(T.Category);
2、定义填充函数,对每组计算中位数:fillFun = @(x)fillmissing(x, 'constant', median(x, 'omitnan'));
3、使用splitapply逐组应用:T.FillData = splitapply(fillFun, T.OriginalData, G);
4、关键提示:自定义函数必须接受单列向量输入并返回等长向量,且内部需显式声明'omitnan'选项;
五、基于邻近行匹配的填充
该方法查找与当前缺失行在其他字段上最相似的非缺失行,提取其目标列值用于填充,适用于多维特征空间中的语义关联场景。
1、提取不含目标列的特征列构成矩阵X:X = table2array(T(:, {'Age','Gender','Region'}));
2、对分类变量进行独热编码:X = dummyvar(categorical(X(:,2)));
3、遍历每行NaN,用余弦距离搜索最近邻:[~,idx] = min(pdist2(X(ismissing(T.Target),:), X(~ismissing(T.Target),:), 'cosine'));
4、将对应非缺失行的Target值赋给当前行:T.Target(ismissing(T.Target)) = T.Target(~ismissing(T.Target))(idx);

















