Как извлечь элементы в массиве с несколькими записями?

У меня есть большой вектор, содержащий монотонно увеличивающиеся данные или дубликат, выглядящие примерно так:

data = [0 1.1 2.2 3.3 4.4 4.4 4.4 4.4 5.5 6.6 6.6 6.6 7.7];

В этом наборе данных меня интересуют дубликаты записей (в данном случае 4.4 и 6.6). У меня есть неудобное решение для извлечения этих значений, но я чувствую, что MATLAB должен иметь однострочное решение для получения результата, например

result = [4.4 6.6];

Ответ 1

Сочетание unique и diff достаточно, find на самом деле не нужно.

out = unique(data(~diff(data)))

Ответ 2

Здесь другой вариант, используя только hist и индексирование:

result = data(hist(data, data) > 1);

Ответ 3

Мой один лайнер:

unique(data(find(diff(data)==0)))

Проверьте здесь!


Объяснение:

  • с diff вы получаете отличия от одного элемента к другому.

  • Когда массив предварительно упорядочен, результат указанной выше строки будет выводить ноль на повторяющиеся.

  • С find(result_from_above == 0) я получаю, где они живут (индексы для нулей)

  • С data(result_from_above) я получаю повторяющиеся элементы, а затем применяются уникально для их получения.

Update:

Вы можете использовать логическое индексирование, как сказал @rayryeng, вам не нужен find, а затем он становится:

unique(data(diff(data)==0)); 

Затем проверьте здесь

Ответ 4

Вы можете сделать следующее.

[~,index]=unique(data);
unique(data(setdiff(1:length(data),index)))

index будет иметь индексы для уникальных значений, setdiff удалит эти индексы из вектора 1:length(data), которые являются неуникальными значениями индекса. Затем они индексируются с помощью вектора data, и снова уникальная применяется для получения по мере необходимости.