Как отделить повторяющиеся номера - PullRequest
0 голосов
/ 07 июля 2019

У меня есть данные такого типа

A = [1   0.5
     1   0.1
     1   0.3
     2   1
     2   0.5
     2   0.1
     2   1
     5   2  ]

Глядя на первый столбец, могут быть повторяющиеся числа, и те, которые появляются только один раз.Из строк, начинающихся с повторяющихся чисел, я хочу выбрать последнее вхождение вместе с остальной частью строки.Для приведенного выше примера мой вывод будет:

Output = [1  0.3
          2  1  ]

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 07 июля 2019

Используя функцию unique, вы можете легко решить свою проблему:

 %%% Find the first indices of the unique numbers in column 1
 [~, i_first, ~] = unique(A(:,1),'first');

 %%% Then, find the last indices of the unique numbers in column 1
 [~, i_last, ~] = unique(A(:,1),'last');

 %%% Lastly, remove the entries with the same starting and finishing index
 %%% from the last indices vector
 i_last(i_last == i_first) = [];

 %%% Output the requested values
 Output = A(i_last, :);

Это решение предполагает следующее: (любезно предоставлено Dev-iL )
1. первый столбец должен содержать целые числа (в противном случае для этого потребуется uniquetol)
2. несмежные группы рассматриваются как смежные (т.е. выполняется неявная сортировка)

1 голос
/ 07 июля 2019

Я собираюсь предположить пару вещей:

  1. Первый столбец не должен быть отсортирован, а рассматриваются только смежные группы (т. Е. Если первый столбец содержит записи типа [2;2;2;3;2], последняя строка не будет считаться частью "2 группы").Если вы хотите, чтобы учитывались отдельные строки / группы, обязательно отсортируйте строки из A перед применением этого алгоритма).
  2. Первый столбец содержит только целые числа.

Вот мое предложение:

out = A( [false; diff([logical(diff(A(:,1),1)); true])>0], :);

Объяснение того, как это работает:

  • Мы дифференцируем первый столбец, чтобы обнаружить переходы значений.
  • До конца предыдущего результата мы объединяем true, так что, если последняя строка является частью группы, она учитывается.
  • Затем мы дифференцируем это снова, чтобы мы обнаружили последовательные переходы (как 2->5 в вашем примере. Мы сохраняем только «положительные» переходы, потому что только это указывает на новое число в первом столбце.
  • Наконец, мы объединяем false в начале, потому что первая строканикогда не выбирается.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...