Замените NaN на значение выше (для сопоставления идентификаторов) — Matlab

#matlab #matrix #nan

#matlab #матрица #nan

Вопрос:

У меня есть матрица с идентификаторами Col1 и значениями Col2.

 mat = [ ...
      1000 3
      1000 4
      1000 nan
      1000 nan
      1000 5

      2222 1
      2222 2
      2222 nan

      3333 nan

      4444 1 ] ;
  

Мне нужно nan заменить значение в строке над ним, но при условии: строка выше должна иметь тот же идентификатор.

Ответ:

 mat = [ ...
      1000 3
      1000 4
      1000 4
      1000 4
      1000 5

      2222 1
      2222 2
      2222 2

      3333 nan

      4444 1 ] ;
  

Можете ли вы предложить векторизованный подход?

Комментарии:

1. Я не думаю, что эта проблема хорошо векторизуется из-за необходимости найти первое значение, отличное от NaN, если есть последовательные NAN с одинаковым идентификатором.

2. Простые циклы выполняются очень быстро с помощью JIT Matlab. Цикл не соответствует вашим потребностям?

Ответ №1:

Этот код не будет обрабатывать последовательные NAN с одинаковым идентификатором.

 inds = find([mat(2:end,1)==mat(1:end-1,1)] amp; isnan(mat(2:end,2)))
mat(inds 1,2) = mat(inds,2)
  

Выполнение его дважды для выборки данных завершает задачу.

Комментарии:

1. Первое условие можно записать просто diff(mat(:,1)) == 0 . Затем просто выполните цикл while numel(inds) > 0 .

2. @Ben не могли бы вы, пожалуйста, объяснить «первое условие?» …. это эквивалентно замене [мат(2: конец, 1)==мат (1: конец-1,1)] ?