2014-12-03 2 views
0

Предположим, у меня есть вектор, который содержит person_ids так:Как найти сегментные индексы вектора в MATLAB?

x = [1,1,1,2,2,3,3,3,3,4] 

поэтому первые 3 элементы для человека 1. Как я могу найти векторные индексы, которые начинаются новый человек?

т.е. моя функция должна возвращать

f(x) = [1,4,6,10]; 

есть способ MATLAB для этого?

ответ

4

Предполагая, что идентификаторы персоны сортируются, и идентификаторы не могут быть отрицательными, вы можете сделать это с помощью

>> x = [1,1,1,2,2,3,3,3,3,4]; 
>> find(diff([-1 x])) 
ans = 

    1 4 6 10 
+0

Ваши предположения верны для моего случая, поэтому это решает мою проблему. Спасибо! – jeff

2

ответ преторианской является довольно хорошо, но если вы хотите другой альтернативы, вы можете использовать второй выход unique. Второй вывод определяет местоположения первого значения для конкретной входной последовательности.

Также предполагая, что идентификаторы человека сортируются, вы можете просто сделать это:

[~,y,~] = unique(x) 

y = 

1 
4 
6 
10 

Minor Примечание

Если вы посмотрите на unique documentation до версии R2013a, она используется для поиска местоположение последнее уникальное значение для входной последовательности в вашем массиве. Теперь это изменилось на первое место по сравнению с R2013a ... которое есть версия, которую я имею. Таким образом, если у вас есть версия MATLAB, которая находится перед R2013a, вам нужно добавить флаг 'first' в качестве второго параметра к уникальному. Поэтому:

[~,y,~] = unique(x, 'first'); 

Если у вас есть R2013a или выше, то вам не нужно беспокоиться об этом ... но это что-то вспомнить, должно у вас есть что-то более старый.

+0

++ 1, так как это не требует добавления -1, как мое решение. Но действительно ли MATLAB производит этот результат? Octave требует, чтобы я использовал '[~, y, ~] = unique (x," first ")', иначе он возвращает индексы последних уникальных элементов ('3 5 9 10') по умолчанию. – Praetorian

+0

@Praetorian да, это работает на моем конце с MATLAB R2013a. Характерно, как в Octave вам нужно указать флаг 'first'! – rayryeng

+0

По-видимому, [MATLAB модифицировал это поведение в R2013a] (http://www.mathworks.com/help/matlab/ref/unique.html) (поиск * Сохранение устаревшего поведения уникального *). Второе возвращаемое значение было вектором строки, содержащим последние индексы, но теперь это вектор столбца, содержащий первые индексы. – Praetorian

Смежные вопросы