MATLAB中使用rmoutliers()插入数据时如何保留输入数组形状?
MATLAB rmoutliers离群值补全与数组保形方案
原生功能说明
rmoutliers本身不支持自动对离群值移除后的孔洞做插值补全:
- 它的默认行为是直接删除离群值元素,会改变原数组的尺寸
- 即便使用
'FillValue'参数实现保形输出,也只能填入固定值(如NaN、均值、中位数),无法直接生成插值结果
插值补全实现思路
你可以通过「先检测离群值位置,再单独做插值填充」的逻辑实现需求,具体步骤如下:
- 第一步:调用
rmoutliers获取离群值掩码,不要直接删除离群值
% 第二个输出参数isOutlier是和原数组同尺寸的逻辑数组,值为1对应离群值位置 [~, isOutlier] = rmoutliers(A, 你配置的离群值检测参数); % 比如可以加'MeanThreshold'、'MedianThreshold'等参数
- 第二步:根据数组类型选择对应插值方法补全
- 一维时序数据用
interp1实现:
- 一维时序数据用
x = 1:length(A); % 提取非离群值的坐标和对应数值 x_valid = x(~isOutlier); A_valid = A(~isOutlier); % 可替换插值方法为pchip、spline等,extrap参数用于处理边缘离群值的外插 A_filled = interp1(x_valid, A_valid, x, 'linear', 'extrap');
- 二维网格/图像数据可以用
griddata或者图像修复类函数实现:
% 生成坐标网格 [xGrid, yGrid] = meshgrid(1:size(A,2), 1:size(A,1)); % 提取非离群值的坐标和对应数值 x_valid = xGrid(~isOutlier); y_valid = yGrid(~isOutlier); A_valid = A(~isOutlier); % 线性插值补全,也可替换为'cubic'等方法 A_filled = griddata(x_valid, y_valid, A_valid, xGrid, yGrid, 'linear');
- 第三步:输出的
A_filled和原数组尺寸完全一致,离群值位置已经替换为插值结果,无需额外调整形状。
内容的提问来源于stack exchange,提问作者MD98
相关产品推荐
相关产品推荐

