如何分隔重复数字

时间:2019-07-07 07:58:56

标签: matlab matrix filtering subset rows

我有这种数据

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 个答案:

答案 0 :(得分:1)

我要假设一些事情:

  1. 第一列不必排序,而仅考虑连续的组(即,如果第一列包含诸如[2;2;2;3;2]之类的条目,则最后一行将不被视为“ {{ 1}}组”)。如果要考虑分离的行/组,请确保在应用此算法之前先2中的sort the rows
  2. 第一列仅包含整数。

这是我的建议:

A

其工作方式的解释:

  • 我们区分第一列以检测值转换。
  • 在上一个结果的末尾,我们连接了一个out = A( [false; diff([logical(diff(A(:,1),1)); true])>0], :); ,因此,如果最后一行是组的一部分,则将其考虑在内。
  • 然后我们再次对其进行区分,以便我们检测到连续的过渡(例如您的示例中的true。我们仅保留“正”过渡,因为只有这样才能在第一列中表示一个新数字。
  • 最后,我们将2->5连接到开头,因为从未选择第一行。

答案 1 :(得分:1)

使用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.将不连续的组视为连续的组(即,它隐式执行排序)