Main Content

fillmissing2

Fill missing entries in 2-D data

Since R2023a

    Description

    F = fillmissing2(A,method) fills missing (NaN) entries of a numeric array using the specified method. For example, fillmissing2(A,"cubic") fills missing entries using cubic interpolation of nonmissing entries of A.

    example

    F = fillmissing2(A,movmethod,window) fills missing entries using a 2-D moving window mean or median. For example, fillmissing2(A,"movmedian",3) fills missing entries using a 3-by-3 moving window median.

    example

    F = fillmissing2(___,Name,Value) specifies options using one or more name-value arguments in addition to any of the input argument combinations in previous syntaxes. For example, fillmissing2(A,"linear",SamplePoints={1:5 10:2:18}) specifies the locations of the sample points for the data in A.

    example

    [F,TF] = fillmissing2(___) also returns a logical matrix TF that indicates the positions of the filled entries in F that were previously missing.

    example

    Examples

    collapse all

    Create a 5-by-5 matrix with several NaN values.

    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
    
    

    Fill missing entries of A with nearest nonmissing entries.

    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
    
    

    Create a 51-by-51 grid, and define a function on the grid.

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

    Randomly replace 5% of the values of the function with NaN values to simulate missing data.

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

    Fill missing entries in the data using linear interpolation. Then reshape the data for plotting.

    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);

    Plot the original data together with the filled data.

    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.

    Create an 8-by-8 matrix. Randomly replace 5% of the matrix elements with NaN values to simulate missing data.

    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
    
    

    Fill missing entries of A using a 2-by-3 moving window median centered at the current position.

    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
    
    

    Create a 5-by-5 matrix of the first 25 square roots.

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

    Replace one matrix element with a NaN value to simulate a missing entry. Replace another matrix element with an outlying value.

    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
    
    

    Define missing entries to be those entries with either a value of NaN or an absolute value greater than 10.

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

    Fill NaN values and outliers using the MissingLocations name-value argument. Use the optional TF output argument to confirm that both the NaN entry and the outlying entry are filled.

    [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 = 5x5 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
    
    

    Create a 5-by-5 matrix with several NaN values.

    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
    
    

    Specify nonuniformly spaced sample points for filling missing entries using linear interpolation.

    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
    
    

    Also fill missing entries using linear interpolation with uniformly spaced sample points. Compare the results in FNonuni and FUni.

    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
    
    

    Input Arguments

    collapse all

    Input data, specified as a numeric matrix.

    Data Types: double | single
    Complex Number Support: Yes

    Fill method, specified as one of the values in this table.

    MethodDescription
    "nearest"Nearest nonmissing entry
    "linear"Linear interpolation of nonmissing entries
    "natural"Natural neighbor interpolation of nonmissing entries
    "cubic"Cubic interpolation of nonmissing entries
    "v4"Biharmonic spline interpolation of nonmissing entries

    Moving method to fill missing data, specified as one of the values in this table.

    MethodDescription
    "movmean"Moving mean over a window described by window
    "movmedian"Moving median over a window described by window

    Window description for moving methods, specified as a positive integer or duration scalar, a two-element cell array of positive integer or duration values, or a two-element cell array of two-element vectors of nonnegative integer or duration values. The window is defined relative to the sample points.

    If window is a positive integer scalar, then the window is a window-by-window block of neighboring entries. If window is odd, then the window is centered about the current entry; if window is even, then the window is centered about the 2-by-2 submatrix of A whose bottom-right entry is the current entry.

    If window is a two-element cell array of positive integers {m n}, then the window is an m-by-n block centered about the current entry.

    If window is a two-element cell array of two-element vectors of nonnegative integers {[bRow fRow] [bCol fCol]}, then the window contains the row and column of the current entry, the preceding bRow and succeeding fRow rows, and the preceding bCol and succeeding fCol columns.

    If window has type duration, then you must specify the SamplePoints name-value argument as a two-element cell array of either datetime or duration values.

    Name-Value Arguments

    Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

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

    Sample points, specified as a two-element cell array {xs ys} of vectors of sample point values. The sample points in the xs vector represent the x-axis locations of the data, and the sample points in the ys vector represent the y-axis locations of the data. Both xs and ys must be sorted, must not contain duplicate elements, and must match the size of A in the corresponding grid dimension. Sample points do not need to be uniformly sampled. If A is an m-by-n matrix, then 1:m is the default value for xs and 1:n is the default value for ys.

    Moving windows are defined relative to the sample points. For example, if xs and ys are vectors of times corresponding to the input data, then fillmissing2(rand(10,10),"movmedian",duration([0 0 5]),SamplePoints={xs ys}) uses a window that represents the interval of 2.5 seconds before and after the time of the current element. When the sample point vectors have data type datetime or duration, the moving window description must have type duration.

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

    Known missing indicator, specified as a logical matrix of the same size as A. The indicator elements can be 1 (true) to indicate a missing value in the corresponding location of A or 0 (false) otherwise.

    Output Arguments

    collapse all

    Filled data, returned as a numeric matrix. F is the same size as A.

    Filled data indicator, returned as a logical matrix. TF is a logical matrix where 1 (true) corresponds to filled entries in F that were previously missing and 0 (false) corresponds to unchanged entries.

    TF is the same size as F.

    Version History

    Introduced in R2023a