Как линейно интерполировать значения NaN в MATLAB?

Вероятно, это очень простой и часто задаваемый вопрос, однако я перепробовал множество решений, но ни одно из них не сработало для меня.

У меня есть разные временные ряды, которые содержат NaN в разных местах, поэтому я хочу получить единое решение для их заполнения.

Например :

var1 = [80.2 , 76.5 , NaN , 62.3];
var2 = [NaN , NaN , 100.5 , 102.4];
var3 = [1.2 , 4.7 , NaN, NaN];

Мне просто нужен простой код интерполяции, чтобы я мог получить приблизительные полные данные следующим образом:

var1_filled = fill_vector(var1);

Что я пробовал:

Я пытался использовать naninterp, но так как он кубический, например var3 идет в порядке из 1e4, чего я не хочу. И если я изменю аргумент 'cubic' на 'linear', то он не будет обрабатывать NaN.

Я также пытался сам реализовать аналогичную функцию, которая также не обрабатывает NaN:

dd_x=find(~isnan(dd));
dd_y=dd(~isnan(dd));
yi=interp1(dd_x,dd_y,1:length(dd));

person jeff    schedule 18.10.2014    source источник


Ответы (1)


Вы находитесь рядом:

t = 1:numel(var1);
var1_filled = interp1(t(~isnan(var1)),var1(~isnan(var1)),t,'linear','extrap');

Вы должны повторить это для каждой из переменных, поскольку значения nan или разные индексы. Экстраполяция необходима для var2 и var3.

((Этот ответ, кстати, почти идентичен этому.))

person MeMyselfAndI    schedule 18.10.2014
comment
Спасибо! Это сработало хорошо для одной переменной, пожалуйста, дайте мне посмотреть, работает ли это для всех моих переменных, и тогда я соглашусь. - person jeff; 18.10.2014
comment
Я просто хотел убедиться, и я сделал. Это работает очень хорошо. Спасибо за это быстрое и точное решение :) - person jeff; 18.10.2014
comment
Было бы неплохо, если бы решение можно было получить за один раз, но, поскольку у вас есть значения NaN в конце и начале ваших массивов, этот одноразовый подход возможен только тогда и только тогда, когда вы объединяете их следующим образом: A = [var2 var1 var3]. - person MeMyselfAndI; 18.10.2014
comment
О, это не проблема, я просто использую его с циклом for для всех переменных. - person jeff; 18.10.2014
comment
Вы можете сообщать о повторяющихся случаях в качестве комментариев к вопросам. Таким образом, снижается нагрузка на SO. - person Divakar; 18.10.2014