Ответ 1
Вы можете попробовать следующее:
v = [ 6 7 8 12 13 14 15 26 27 28 29 30 55 56];
x = [0 cumsum(diff(v)~=1)];
v(x==mode(x))
В результате получается
ans =
26 27 28 29 30
У меня есть подпрограмма, которая возвращает список целых чисел в виде вектора.
Эти целые числа поступают из групп последовательных чисел; например, он может выглядеть так:
vector = 6 7 8 12 13 14 15 26 27 28 29 30 55 56
Обратите внимание, что выше, есть четыре "пробега" чисел (6-8, 12-15, 26-30 и 55-56). То, что я хотел бы сделать, - перевести самый длинный "пробег" чисел на новый вектор. В этом случае это будет запуск 26-30, поэтому я хотел бы создать:
newVector = 26 27 28 29 30
Этот расчет должен выполняться много, много раз на разных векторах, поэтому более эффективно я могу сделать это лучше! Любая мудрость будет с благодарностью воспринята.
Вы можете попробовать следующее:
v = [ 6 7 8 12 13 14 15 26 27 28 29 30 55 56];
x = [0 cumsum(diff(v)~=1)];
v(x==mode(x))
В результате получается
ans =
26 27 28 29 30
Вот решение, чтобы получить мяч.,
vector = [6 7 8 12 13 14 15 26 27 28 29 30 55 56]
d = [diff(vector) 0]
maxSequence = 0;
maxSequenceIdx = 0;
lastIdx = 1;
while lastIdx~=find(d~=1, 1, 'last')
idx = find(d~=1, 1);
if idx-lastIdx > maxSequence
maxSequence = idx-lastIdx;
maxSequenceIdx = lastIdx;
end
d(idx) = 1;
lastIdx=idx;
end
output = vector(1+maxSequenceIdx:maxSequenceIdx+maxSequence)
В этом примере команда diff используется для поиска последовательных номеров. Когда числа являются последовательными, разница равна 1. Затем цикл while используется для поиска самой длинной группы из них, и индекс этой последовательной группы сохраняется. Тем не менее, я уверен, что это можно было бы оптимизировать дальше.
Без циклов - должно быть быстрее
temp = find ( ([(vector(2:end) - vector(1:end-1))==1 0])==0);
[len,ind]=max(temp(2:end)-temp(1:end-1));
vec_out = vector(temp(ind)+1:temp(ind)+len)
Без циклов с использованием diff
:
vector = [6 7 8 12 13 14 15 26 27 28 29 30 55 56];
seqGroups = [1 find([1 diff(vector)]~=1) numel(vector)+1]; % beginning of group
[~, groupIdx] = max( diff(seqGroups)); % bigger group index
output = vector( seqGroups(groupIdx):seqGroups(groupIdx+1)-1)
выходной вектор
ans =
26 27 28 29 30