MATLAB fillmissing函数完整用法指南:参数、方法与示例详解

作者:异步漫步

时间:2026-10-30

浏览:453

本文详细介绍MATLAB中fillmissing函数的多种用法,涵盖常量填充、前后值填充、移动均值/中位数、最近邻及自定义插值等方法。通过具体代码示例解析参数配置与输出结果,帮助开发者高效处理向量、矩阵及表中的NaN、NaT等缺失数据。

文章目录

fillmissing函数的核心作用是填补数据中的缺失条目。

语法

F = fillmissing(A,'constant',v)
F = fillmissing(A,method)
F = fillmissing(A,movmethod,window)
F = fillmissing(A,'knn')
F = fillmissing(A,'knn',k)
F = fillmissing(A,fillfun,gapwindow)
F = fillmissing(___,dim)
F = fillmissing(___,Name,Value)
[F,TF] = fillmissing(___)

说明

F = fillmissing(A,'constant',v) 通过指定常量值 v 来填充数组或表中的缺失项。若 A 为矩阵或多维数组,v 可以是标量或向量;当 v 为向量时,其各元素分别对应 A 中各列的填充值。若 A 为表或时间表,v 也可以是元胞数组,其中包含每个表变量的具体填充值。

缺失值的判定标准依据 A 的数据类型而定:

  • NaN - double、single、duration 和 calendarDuration
  • NaT — datetime
  • <missing> — string
  • <undefined> — categorical
  • {''} - 字符向量的 cell

若 A 为表结构,则各变量的数据类型决定了该变量缺失值的表示形式。

F = fillmissing(A,method) 依据 method 指定的算法填充缺失项。例如,fillmissing(A,'previous') 利用 A 中前一个非缺失值来填充当前的缺失条目。

F = fillmissing(A,movmethod,window) 利用长度为 window 的移动窗口均值或中位数来填充缺失项。例如,fillmissing(A,'movmean',5) 使用窗口长度为 5 的移动均值处理数据。

F = fillmissing(A,'knn') 基于行间成对欧几里德距离,利用最近邻行中的对应值填充缺失项。

F = fillmissing(A,'knn',k) 基于行间成对欧几里德距离,利用 k 个最近邻行对应值的均值填充缺失项。例如,fillmissing(A,'knn',5) 使用五个最近邻行的均值填充 A 中的缺失条目。

F = fillmissing(A,fillfun,gapwindow) 通过函数句柄 fillfun 指定的自定义方法填充空缺,并在每个空缺周围设定固定窗口以计算填充值。fillfun 需接受 xs、ts 和 tq 三个向量参数,分别代表长度为 gapwindow 的采样数据、采样点位置及缺失数据位置。ts 和 tq 中的位置为采样点向量的子集。

F = fillmissing(___,dim) 支持上述任意输入参数组合,并可指定 A 中执行运算的维度。默认情况下,fillmissing 沿其大小不为 1 的第一个维度运算。例如,若 A 为矩阵,fillmissing(A,2) 将跨列运算,逐行填充缺失数据。

F = fillmissing(___,Name,Value) 通过一个或多个名称-值对参数指定其他填充缺失值的选项。例如,若 t 为时间值向量,fillmissing(A,'linear','SamplePoints',t) 将基于 t 中的时间值对 A 中的数据进行线性插值。

[F,TF] = fillmissing(___) 同时返回逻辑数组 TF,该数组标识 F 中先前缺失现已填充的条目位置。

示例

包含 NaN 值的向量

构建包含 NaN 值的向量,并利用前一个非缺失值替换每个 NaN。

A = [1 3 NaN 4 NaN NaN 5];
F = fillmissing(A,'previous')
F = 1×7
     1     3     3     4     4     4     5

由 NaN 值组成的矩阵

构建一个 2×2 矩阵,每列含一个 NaN 值。在第一列用 100 填充 NaN,在第二列用 1000 填充。

A = [1 NaN; NaN 2]
A = 2×2
     1   NaN
   NaN     2
F = fillmissing(A,'constant',[100 1000])
F = 2×2
           1        1000
         100           2

插入缺失数据

利用插值法替换非均匀采样数据中的 NaN 值。定义非均匀采样点向量,并计算这些点上的正弦函数值。

x = [-4*pi:0.1:0, 0.1:0.2:4*pi];
A = sin(x);

将 NaN 值插入 A 中。

A(A < 0.75 & A > 0.5) = NaN;

使用线性插值填充缺失数据,并返回填充后的向量 F 及逻辑向量 TF。TF 中值为 1 (true) 的项对应 F 中被填充的值。

[F,TF] = fillmissing(A,'linear','SamplePoints',x);

绘制原始数据与填充后数据的对比图。

scatter(x,A)
hold on
scatter(x(TF),F(TF))
legend('Original Data','Filled Data')

如图所示:

语法

使用移动中位数方法

利用移动中位数填充缺失的数值数据。构建样本点向量 x 及包含缺失值的数据向量 A。

x = linspace(0,10,200); 
A = sin(x) + 0.5*(rand(size(x))-0.5); 
A([1:10 randi([1 length(x)],1,50)]) = NaN; 

使用窗口长度为 10 的移动中位数替换 A 中的 NaN 值,并绘制原始数据与填充数据的对比图。

F = fillmissing(A,'movmedian',10);  
plot(x,F,'.-') 
hold on
plot(x,A,'.-')
legend('Original Data','Filled Data')

如图所示:

语法

使用自定义填充方法

定义一个自定义函数,利用前一个非缺失值填充 NaN 值。构建采样点向量 t 及包含 NaN 值的对应数据向量 A,并绘制数据图。

t = 10:10:100;
A = [0.1 0.2 0.3 NaN NaN 0.6 0.7 NaN 0.9 1];
scatter(t,A)

如图所示:

语法

利用局部函数 forwardfill(在示例末尾定义)通过前一个非缺失值填充缺失空缺。函数句柄输入包括:

  • xs - 用于填充的数据值
  • ts - 用于填充的值相对于采样点的位置
  • tq - 缺失值相对于采样点的位置
  • n - 要填充的空缺中的值的数目
n = 2;
gapwindow = [10 0];
[F,TF] = fillmissing(A,@(xs,ts,tq) forwardfill(xs,ts,tq,n),gapwindow,'SamplePoints',t);

空缺窗值 [10 0] 指示 fillmissing 考虑缺失值空缺之前的一个数据点,不考虑空缺之后的任何数据点,因为上一个非缺失值位于空缺之前 10 个单位。对于第一个空缺,由 fillmissing 确定的函数句柄输入值为:

  • xs = 0.3
  • ts = 30
  • tq = [40 50]

第二个空缺的函数句柄输入值为:

  • xs = 0.7
  • ts = 70
  • tq = 80

绘制原始数据与填充后数据的对比图。

scatter(t,A)
hold on
scatter(t(TF),F(TF))

如图所示:

语法

function y = forwardfill(xs,ts,tq,n)
% Fill n values in the missing gap using the previous nonmissing value
y = NaN(1,numel(tq));
y(1:min(numel(tq),n)) = xs;
end

包含缺失端点的矩阵

构建包含缺失条目的矩阵,并使用线性插值填充各列(第二个维度),逐行处理。对于每行,利用该行中距离最近的非缺失值填充前导和尾随缺失值。

A = [NaN NaN 5 3 NaN 5 7 NaN 9 NaN;
     8 9 NaN 1 4 5 NaN 5 NaN 5;
     NaN 4 9 8 7 2 4 1 1 NaN]
A = 3×10
   NaN   NaN     5     3   NaN     5     7   NaN     9   NaN
     8     9   NaN     1     4     5   NaN     5   NaN     5
   NaN     4     9     8     7     2     4     1     1   NaN
F = fillmissing(A,'linear',2,'EndValues','nearest')
F = 3×10
     5     5     5     3     4     5     7     8     9     9
     8     9     5     1     4     5     5     5     5     5
     4     4     9     8     7     2     4     1     1     1

包含多个数据类型的表

利用不同数据类型填充表变量的缺失值。构建包含 categorical、double 和 char 数据类型的表。

A = table(categorical({'Sunny'; 'Cloudy'; ''}),[66; NaN; 54],{''; 'N'; 'Y'},[37; 39; NaN],...
    'VariableNames',{'Description' 'Temperature' 'Rain' 'Humidity'})
A=3×4 table
    Description    Temperature       Rain       Humidity
    ___________    ___________    __________    ________
    Sunny               66        {0x0 char}       37   
    Cloudy             NaN        {'N'     }       39   
    <undefined>         54        {'Y'     }      NaN   

利用前一个条目的值替换所有缺失条目。由于 Rain 变量中不存在前一个元素,缺失的字符向量将不会被替换。

F = fillmissing(A,'previous')
F=3×4 table
    Description    Temperature       Rain       Humidity
    ___________    ___________    __________    ________
      Sunny            66         {0x0 char}       37   
      Cloudy           66         {'N'     }       39   
      Cloudy           54         {'Y'     }       39   

将 A 中 Temperature 和 Humidity 变量的 NaN 值替换为 0。

F = fillmissing(A,'constant',0,'DataVariables',{'Temperature','Humidity'})
F=3×4 table
    Description    Temperature       Rain       Humidity
    ___________    ___________    __________    ________
    Sunny              66         {0x0 char}       37   
    Cloudy              0         {'N'     }       39   
    <undefined>        54         {'Y'     }        0   

参数说明:

A-输入数据,指定为向量、矩阵、多维数组、字符向量元胞数组、表或时间表。

  • 若 A 为时间表,则仅填充表值。若关联的行时间向量包含 NaT 或 NaN 值,fillmissing 会报错。行时间必须唯一且按升序排列。
  • 若 A 是元胞数组或包含元胞数组变量的表,则 fillmissing 仅在元胞数组包含字符向量时填充缺失元素。

v-填充常量,指定为标量、向量或元胞数组。

  • 若 A 为矩阵或多维数组,v 可以是向量,表示每个运算维度的不同填充值。v 的长度必须与运算维度的长度匹配。
  • 若 A 为表或时间表,v 可以是填充值的元胞数组,表示每个变量的不同填充值。元胞数组中的元素数必须与表中的变量数目匹配。

method-填充方法,指定为下列值之一:

方法描述
'previous'上一个非缺失值
'next'下一个非缺失值
'nearest'距离最近的非缺失值
'linear'相邻非缺失值的线性插值(仅限数值、duration 和 datetime 数据类型)
'spline'分段三次样条插值(仅限数值、duration 和 datetime 数据类型)
'pchip'保形分段三次样条插值(仅限数值、duration 和 datetime 数据类型)
'makima'修正 Akima 三次 Hermite 插值(仅限数值、duration 和 datetime 数据类型)

movmethod — 移窗法

填充缺失数据的移动方法,指定为下列值之一:

方法描述
'movmean'窗长度为 window 的移动均值(仅限数值数据类型)
'movmedian'窗长度为 window 的移动中位数(仅限数值数据类型)

window — 窗长度

移动方法的窗长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。窗口相对于采样点定义。

若 window 为正整数标量,则窗口以当前元素为中心,包含 window-1 个相邻元素。若 window 为偶数,窗口以当前元素和上一个元素为中心。

若 window 为由正整数组成的二元素向量 [b f],则窗口包含当前元素、其之前的 b 个元素和之后的 f 个元素。

若 A 为时间表或 SamplePoints 指定为 datetime 或 duration 向量,则窗口必须为 duration 类型。

k — 最近邻的数量,用 'knn' 方法计算平均值的最近邻的数量,指定为正整数标量。

到此这篇关于MATLAB中fillmissing函数用法的文章就介绍到这了,更多相关MATLAB中fillmissing函数内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章