анализ последовательностей Matlab - PullRequest
2 голосов
/ 08 февраля 2012

Я пытаюсь написать короткую функцию matlab, которая получит вектор и вернет мне индекс первого элемента самой длинной последовательности 1 с (могу предположить, что последовательность состоит из 1 и 0).например:

IndexLargeSeq ([110001111100000000001111111111110000000000000000000000000000000])

вернет 21 - это индекс первой 1 из самой длинной последовательности1с.
спасибо
Ариэль

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Итак, вы идете:

% input:
A = [0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1]';

% replace 0 with 2 because the next command doesn't work with '0' as values
A(A == 0) = 2;

% accumulate data sets
B = [A(diff([A; 0]) ~= 0), diff(find(diff([0; A; 0])))];

% maximize second column where first column == 1
maxSeq = max(B(B(:, 1) == 1, 2));

% get row of B where first column == 1 && second column == maxSeq
row = find(B(:,1) == 1 & B(:,2) == maxSeq, 1);

% calculate the index of the first 1s of this longest sequence:
idx = sum(B(1:(row-1),2)) + 1

idx, чем является значение (индекс), который вы ищете, maxSeq - это длина этой последовательности 1 с.A должен быть вектором строки.

Если вы хотите понять, как накапливаются наборы данных (команда B = ...), посмотрите здесь: Как накапливать наборы данных? .

0 голосов
/ 09 февраля 2012

Вот еще один вариант измерения расстояний между индексами 0 с. Код учитывает ситуации, если 1 вообще не существует (возвращает пустой вектор) или если есть несколько последовательностей с самой длинной длиной. x - вектор входной строки.

idx = find([1 ~x 1]); %# indices of 0s +1
idxdiff = diff(idx); %# lengths of sequences (+1)
maxdiff = max(idxdiff);
if maxdiff == 1
    maxseqidx = []; %# no 1s at all
else
    %# find all longest sequences, may be more then one
    maxidx = find(idxdiff == maxdiff);
    maxseqidx = idx(maxidx);
end
disp(maxseqidx)

РЕДАКТИРОВАТЬ : Если x может быть вектором строки или столбца, вы можете изменить первую строку на

idx = find([1; ~x(:); 1]);

В этом случае на выходе будет вектор столбца.

...