#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
. Затем просто выполните цикл whilenumel(inds) > 0
.2. @Ben не могли бы вы, пожалуйста, объяснить «первое условие?» …. это эквивалентно замене [мат(2: конец, 1)==мат (1: конец-1,1)] ?