Серия последовательных номеров (разной длины) - PullRequest
6 голосов
/ 21 октября 2011

Буду признателен, если кто-нибудь покажет мне простой способ сделать это. Допустим, у меня есть вектор в MATLAB вроде

d = [3 2 4 2 2 2 3 5 1 1 2 1 2 2 2 2 2 9 2]

Я хочу найти серию последовательных чисел "двойки" и длины этих серий.

Число двое можно легко найти по x=find(d==2). Но я хочу получить вектор, который содержит длины всех серий последовательных чисел по два, что означает, что мой результат в этом случае будет иметь такой вектор:

[1 3 1 5 1].

Кто-нибудь, кто мог бы помочь мне?

Ответы [ 3 ]

9 голосов
/ 21 октября 2011

Это похоже на работу:

q = diff([0 d 0] == 2);
v = find(q == -1) - find(q == 1);

дает

v =

   1   3   1   5   1

для меня

6 голосов
/ 21 октября 2011

Это называется кодировка длины пробега .Для этого есть хороший m-файл http://www.mathworks.com/matlabcentral/fileexchange/4955-rle-deencoding.Этот метод обычно быстрее, чем ранее опубликованный способ сравнения / поиска.

tic
d_rle = rle(d==2);
d_rle{2}(d_rle{1}==1);
toc

Истекшее время составляет 0,002632 секунды.

tic
q = [0 diff([0 d 0] == 2)];
find(q == -1) - find(q == 1);
toc

Истекшее время составляет 0,003061 секунды.

0 голосов
/ 09 ноября 2014

Что если нам нужны индексы исходной матрицы, в которой расположены последовательные значения? Кроме того, что если нам нужна матрица того же размера, что и исходная матрица, в которой количество последовательных значений хранится в индексах последовательных значений? Например:

  original_matrix = [1 1 1;2 2 3; 1 2 3];

  output_matrix = [3 3 3;2 2 0;0 0 0];

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

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

...