主要内容

fillmissing2

填充二维数据中的缺失条目

自 R2023a 起

    说明

    F = fillmissing2(A,method) 使用指定方法填充数值数组的缺失 (NaN) 条目。例如,fillmissing2(A,"cubic") 使用 A 的非缺失条目的三次插值填充缺失条目。

    示例

    F = fillmissing2(A,movmethod,window) 使用二维移动窗均值或中位数填充缺失条目。例如,fillmissing2(A,"movmedian",3) 使用 3×3 移动窗中位数填充缺失条目。

    示例

    F = fillmissing2(___,Name,Value) 支持上述语法中的任何输入参量组合,且可使用一个或多个名称-值参量指定选项。例如,fillmissing2(A,"linear",SamplePoints={1:5 10:2:18}) 指定 A 中数据的采样点位置。

    示例

    [F,TF] = fillmissing2(___) 还返回逻辑矩阵 TF,该数组指示 F 中先前缺失现已填充的条目的位置。

    示例

    示例

    全部折叠

    创建一个包含多个 NaN 值的 5×5 矩阵。

    A = magic(5);
    A(1,2) = NaN;
    A(3:4,3:4) = NaN
    A = 5×5
    
        17   NaN     1     8    15
        23     5     7    14    16
         4     6   NaN   NaN    22
        10    12   NaN   NaN     3
        11    18    25     2     9
    
    

    用最接近的非缺失条目填充 A 的缺失条目。

    F = fillmissing2(A,"nearest")
    F = 5×5
    
        17     1     1     8    15
        23     5     7    14    16
         4     6     7    22    22
        10    12    25     3     3
        11    18    25     2     9
    
    

    创建一个 51×51 网格,并基于该网格定义一个函数。

    n = 51;
    [x,y] = meshgrid(linspace(-2,2,n));
    f = x.^2-y.^2;

    NaN 值随机替换函数值的 5% 以仿真缺失数据。

    NaNPercent = 0.05;
    randEntries = randperm(n^2,round(NaNPercent*n^2));
    f(randEntries) = NaN;

    使用线性插值填充数据中的缺失条目。然后重构数据以进行绘图。

    F = fillmissing2(f,"linear");
    x = reshape(x,n^2,1);
    y = reshape(y,n^2,1);
    f = reshape(f,n^2,1);
    F = reshape(F,n^2,1);

    对原始数据与填充后的数据一起绘图。

    filledData = scatter3(x,y,F,24,"red","filled",...
                          MarkerEdgeColor="black");
    hold on
    originalData = scatter3(x,y,f,24,"green","filled",...
                            MarkerEdgeColor="black");
    legend([filledData,originalData],...
           {"Filled","Original"},Location="north")

    Figure contains an axes object. The axes object contains 2 objects of type scatter. These objects represent Filled, Original.

    创建一个 8×8 矩阵。用 NaN 值随机替换矩阵元素的 5% 以仿真缺失数据。

    n = 8;
    A = magic(n);
    NaNPercent = 0.05;
    randEntries = randperm(n^2,round(NaNPercent*n^2));
    A(randEntries) = NaN
    A = 8×8
    
        64     2     3    61    60     6     7    57
         9    55    54    12    13    51    50   NaN
        17    47    46    20    21    43    42    24
        40    26    27    37    36    30    31    33
        32    34    35    29    28    38   NaN    25
        41    23    22    44    45    19    18    48
        49    15    14    52    53    11    10    56
       NaN    58    59     5     4    62    63     1
    
    

    使用以当前位置为中心的 2×3 移动窗中位数填充 A 的缺失条目。

    F = fillmissing2(A,"movmean",{2 3})
    F = 8×8
    
       64.0000    2.0000    3.0000   61.0000   60.0000    6.0000    7.0000   57.0000
        9.0000   55.0000   54.0000   12.0000   13.0000   51.0000   50.0000   38.0000
       17.0000   47.0000   46.0000   20.0000   21.0000   43.0000   42.0000   24.0000
       40.0000   26.0000   27.0000   37.0000   36.0000   30.0000   31.0000   33.0000
       32.0000   34.0000   35.0000   29.0000   28.0000   38.0000   31.4000   25.0000
       41.0000   23.0000   22.0000   44.0000   45.0000   19.0000   18.0000   48.0000
       49.0000   15.0000   14.0000   52.0000   53.0000   11.0000   10.0000   56.0000
       40.6667   58.0000   59.0000    5.0000    4.0000   62.0000   63.0000    1.0000
    
    

    创建一个包含前 25 个平方根的 5×5 矩阵。

    A = reshape((1:25).^(1/2),[5 5])';

    将一个矩阵元素替换为 NaN 值以仿真缺失条目。将另一个矩阵元素替换为异常值。

    A(4,4) = NaN;
    A(2,2) = 100
    A = 5×5
    
        1.0000    1.4142    1.7321    2.0000    2.2361
        2.4495  100.0000    2.8284    3.0000    3.1623
        3.3166    3.4641    3.6056    3.7417    3.8730
        4.0000    4.1231    4.2426       NaN    4.4721
        4.5826    4.6904    4.7958    4.8990    5.0000
    
    

    将缺失条目定义为值为 NaN 或绝对值大于 10 的条目。

    M = isnan(A) | abs(A)>10;

    使用 MissingLocations 名称-值参量填充 NaN 值和离群值。使用可选的 TF 输出参量确认 NaN 条目和离群条目均已填充。

    [F,TF] = fillmissing2(A,"cubic",MissingLocations=M)
    F = 5×5
    
        1.0000    1.4142    1.7321    2.0000    2.2361
        2.4495    2.6432    2.8284    3.0000    3.1623
        3.3166    3.4641    3.6056    3.7417    3.8730
        4.0000    4.1231    4.2426    4.3575    4.4721
        4.5826    4.6904    4.7958    4.8990    5.0000
    
    
    TF = 5×5 logical array
    
       0   0   0   0   0
       0   1   0   0   0
       0   0   0   0   0
       0   0   0   1   0
       0   0   0   0   0
    
    

    创建一个包含多个 NaN 值的 5×5 矩阵。

    A = magic(5);
    A(1,2) = NaN;
    A(3:4,3:4) = NaN
    A = 5×5
    
        17   NaN     1     8    15
        23     5     7    14    16
         4     6   NaN   NaN    22
        10    12   NaN   NaN     3
        11    18    25     2     9
    
    

    指定非等间距采样点,以使用线性插值填充缺失条目。

    xs = [1 1.99 2 2.01 3];
    ys = [1 3 8 9.5 10];
    
    FNonuni = fillmissing2(A,"linear",SamplePoints={xs ys})
    FNonuni = 5×5
    
       17.0000   12.4286    1.0000    8.0000   15.0000
       23.0000    5.0000    7.0000   14.0000   16.0000
        4.0000    6.0000    7.1782   13.8812   22.0000
       10.0000   12.0000    7.3564   13.7624    3.0000
       11.0000   18.0000   25.0000    2.0000    9.0000
    
    

    另请使用等间距采样点通过线性插值填充缺失条目。比较 FNonuniFUni 中的结果。

    FUni = fillmissing2(A,"linear")
    FUni = 5×5
    
       17.0000    9.0000    1.0000    8.0000   15.0000
       23.0000    5.0000    7.0000   14.0000   16.0000
        4.0000    6.0000   11.3333   16.6667   22.0000
       10.0000   12.0000    9.0000    6.0000    3.0000
       11.0000   18.0000   25.0000    2.0000    9.0000
    
    

    输入参数

    全部折叠

    输入数据,指定为数值矩阵。

    数据类型: double | single
    复数支持:

    填充方法,指定为下表中的值之一。

    方法描述
    "nearest"距离最近的非缺失条目
    "linear"非缺失条目的线性插值
    "natural"非缺失条目的自然邻点插值
    "cubic"非缺失条目的三次插值
    "v4"非缺失条目的双调和样条插值

    填充缺失数据的移窗法,指定为下表中的值。

    方法描述
    "movmean"window 描述的窗上的移动均值
    "movmedian"window 描述的窗上的移动中位数

    移窗方法的窗描述,指定为正整数或 duration 标量、正整数或 duration 值的二元素元胞数组,或非负整数或 duration 值的二元素向量的二元素元胞数组。窗是相对于采样点定义的。

    如果 window 是正整数标量,则窗是由相邻条目组成的 window×window 块。如果 window 是奇数,则窗以当前条目为中心;如果 window 是偶数,则窗以 A 的 2×2 子矩阵为中心,该子矩阵的右下角条目是当前条目。

    如果 window 是由正整数组成的二元素元胞数组 {m n},则窗是以当前条目为中心的 m×n 块。

    如果 window 是非负整数的二元素向量的二元素元胞数组 {[bRow fRow] [bCol fCol]},则窗包含当前条目的行和列、前导 bRow 行和后继 fRow 行,以及前导 bCol 列和后继 fCol 列。

    如果 window 的类型为 duration,则必须将 SamplePoints 名称-值参量指定为二元素元胞数组,其元素为 datetimeduration 值。

    名称-值参数

    全部折叠

    将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

    示例: fillmissing2(A,"v4",SamplePoints={1:5,10:2:18})

    采样点,指定为由采样点值向量组成的二元素元胞数组 {xs ys}xs 向量中的采样点表示数据的 x 轴位置,ys 向量中的采样点表示数据的 y 轴位置。xsys 都必须经过排序,不能包含重复元素,并且必须与 A 在对应网格维度上的大小匹配。采样点不需要均匀采样。如果 Am×n 矩阵,则 1:mxs 的默认值,1:nys 的默认值。

    移动窗基于采样点进行定义。例如,如果 xsys 是对应于输入数据的时间向量,则 fillmissing2(rand(10,10),"movmedian",duration([0 0 5]),SamplePoints={xs ys}) 使用窗,该窗表示当前元素时间前后 2.5 秒的时间间隔。当采样点向量的数据类型为 datetimeduration 时,移动窗描述的类型必须为 duration

    示例: fillmissing2(A,"natural",SamplePoints={1:5,10:2:18})

    已知缺失值指示符,指定为与 A 大小相同的逻辑矩阵。指示符元素可以为 1 (true),指示缺失值位于 A 中的对应位置,否则为 0 (false)。

    输出参量

    全部折叠

    填充的数据,以数值矩阵形式返回。FA 大小相同。

    填充的数据指示符,以逻辑矩阵形式返回。TF 是逻辑矩阵,其中 1 (true) 对应于 F 中先前缺失且现已填充的条目,0 (false) 对应于未更改的条目。

    TF 的大小与 F 相同。

    版本历史记录

    在 R2023a 中推出