2013-02-11 2 views
1

Мне нужно сообщить # последовательности в массиве. Например:Поиск # последовательностей в массиве

A=[ 1 1 -1 -1 -1 -1 -1 0 1 -1 -1 -1 -1 1 1 -1 -1 1 0 1 1]

, и я должен сообщить # раз число приходит последовательно, такие как, одна последовательность

5 -1s ([-1 -1 -1 -1 -1]) и одна последовательность

4 -1s ([-1 -1 -1 -1]).

Как я могу узнать, сколько строк чисел есть?

+0

StackOverflow не сервис-код письма. Пожалуйста, прочитайте [руководство по заданию хорошего вопроса] (http://tinyurl.com/so-hints) и покажите [то, что вы пробовали] (http://whatyouhavetried.com). Вы также можете объяснить, какой язык программирования вы используете. –

+0

Я использую Matlab, и я попытался использовать функцию ismember, чтобы найти набор в целевом массиве, однако он не дал мне количество последовательностей, встроенных в мой целевой массив. Есть ли какая-то конкретная функция, которой я не хватает? – user2060814

+0

Почему вы просто не перебираете массив и не отслеживаете статус при прогрессе? –

ответ

0

Если у вас есть только небольшое число возможных значений элементов в A (как в примере на вопрос, где есть только три значения, -1, 0 и 1) вы могли цикл через них и использовать следующие несколько шагов получить длины разных последовательностей.

Вот пример проверки A == -1:

A = [1 1 -1 -1 -1 -1 -1 0 1 -1 -1 -1 -1 1 1 -1 -1 1 0 1 1]; 
B = [0, A==-1, 0]; 

Используйте функцию diff(), чтобы найти начало и конец каждой последовательности и вычесть два вектора, чтобы получить длину последовательности.

>> C = find(diff(B)==-1)-find(diff(B)==1) 

C = 

    5  4  2 

Здесь мы можем видеть, что есть одна последовательность длиной пять, а затем один из длины четыре и один из двух Lenth. Мы могли бы также использовать histc(), чтобы получить частоту этих длин в векторе.

>> D = histc(C,1:max(C)) 

D = 

    0  1  0  1  1 

Повторяя процедуру с другим значением, например, проверка B = [0, A==1, 0]; дает нам:

C = 

    2  1  2  1  2 

D = 

    2  3 
1

Вы можете использовать run-length encoding для выполнения этой задачи

function [rl data] = runLength(vec) 
% run length encoding for vector vec 
rl = (find(vec ~= [vec(2:end), vec(end)+1])); 
data = vec(rl); 
rl(2:end) = rl(2:end) - rl(1:end-1); 

Применение кодирования с переменной длиной до A

>> [rl data] = runLength(A) 
rl = 
    [ 2 5 1 1 4 2 2 1 1 2 ] 
data = 
    [ 1 -1 0 1 -1 1 -1 1 0 1 ] 

Так что, если вы заинтересованы в число последовательностей длины>n все, что вам нужно, это

>> nnz(rl > n) 
Смежные вопросы