Как указать диапазон размеров для последовательных NAN, т.е. игнорировать NAN, длина которых составляет всего один элемент? - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь найти последовательные NAN в наборе данных и заполнить отсутствующие NAN наиболее близким из известных им данных, не мешая NAN, которые я уже заполнил. Пока что код, который я написал для Функция:

function [max_x, min_x] = missing(x)

max_x = x(:, 2);
min_x = x(:, 3);

for jj = 1:length(max_x)
    for kk = 1:length(min_x)
        if isnan (max_x(jj))
            max_x (jj) = ((max_x(jj-1)+max_x(jj+1))/2);
        elseif isnan (min_x(kk))
            min_x (kk) = ((min_x(kk-1)+min_x(kk+1))/2);
        elseif isnan (max_x(jj)>1)
            max_x = fillmissing (max_x,'nearest');
        end
    end
end

Заполняет отдельные NAN. Как мне заполнить другие недостающие последовательные номера NAN?

1 Ответ

0 голосов
/ 26 марта 2020

Попробуйте это

x = [ nan 1 nan 2 nan nan 3 nan 4 nan nan 5 nan ];

% Handle outer nan's special way, just first & last not nan's
in = find(isnan(x));
nnF = find(~isnan(x), 1, 'first');
nnL = find(~isnan(x), 1, 'last');

x( in( in < nnF ) ) = x( nnF );
x( in( in > nnL ) ) = x( nnL );

% Now handle inner nan's
in = find(isnan(x));
nn = find(~isnan(x));

% Find close low & high neighbors
low = interp1( nn , nn , in , 'previous' );
high = interp1( nn , nn , in , 'next' );

% Is it closer to low, high, or equal from both
closerToLow  = in - low <  high - in;
equidistance = in - low == high - in;
closerToHigh = in - low >  high - in;

% Perform transform
x(in(closerToLow)) = x(low(closerToLow));
x(in(equidistance)) = (x(low(equidistance)) + x(high(equidistance)))/2;
x(in(closerToHigh)) = x(high(closerToHigh));
...