Ответ 1
Сочетание unique
и diff
достаточно, find
на самом деле не нужно.
out = unique(data(~diff(data)))
У меня есть большой вектор, содержащий монотонно увеличивающиеся данные или дубликат, выглядящие примерно так:
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];
Сочетание unique
и diff
достаточно, find
на самом деле не нужно.
out = unique(data(~diff(data)))
Здесь другой вариант, используя только hist
и индексирование:
result = data(hist(data, data) > 1);
Мой один лайнер:
unique(data(find(diff(data)==0)))
Проверьте здесь!
Объяснение:
с diff
вы получаете отличия от одного элемента к другому.
Когда массив предварительно упорядочен, результат указанной выше строки будет выводить ноль на повторяющиеся.
С find(result_from_above == 0)
я получаю, где они живут (индексы
для нулей)
С data(result_from_above)
я получаю повторяющиеся элементы, а затем
применяются уникально для их получения.
Update:
Вы можете использовать логическое индексирование, как сказал @rayryeng, вам не нужен find
, а затем он становится:
unique(data(diff(data)==0));
Затем проверьте здесь
Вы можете сделать следующее.
[~,index]=unique(data);
unique(data(setdiff(1:length(data),index)))
index
будет иметь индексы для уникальных значений, setdiff
удалит эти индексы из вектора 1:length(data)
, которые являются неуникальными значениями индекса. Затем они индексируются с помощью вектора data
, и снова уникальная применяется для получения по мере необходимости.