Matlab删除重复的矩阵值

时间:2016-09-25 09:13:40

标签: matlab matrix

我有一个形状如下的矩阵。我想在第一列中删除具有重复值的行,并在第二列中保留具有最小数量的重复值的行。我的矩阵 `d =

 1     1
 2     1
 4     1
 8     2
 2     2
 5     4
 2     4
 6     4
 7     3

` 我想删除第一列中的重复数字2,并在第二行中保留具有最小数量的重复值的行 结果要求:

 1     1
 4     1
 8     2
 2     2
 5     4
 6     4
 7     3

感谢您的帮助。最好的。

2 个答案:

答案 0 :(得分:2)

我们可以对第一列的数组进行排序,并用降序计数替换第二列的元素 获得这个数组:

   1   3
   2   3
   2   3
   2   2
   4   3
   5   3
   6   3
   7   1
   8   2

然后,如果我们对此数组应用唯一,可以获得所需行的索引,然后可以提取这些行:

   1   1
   2   2
   4   1
   5   4
   6   4
   7   3
   8   2

如果需要保留原始数据,请在代码中注明更多步骤。

a=[...
 1     1
 2     1
 4     1
 8     2
 2     2
 5     4
 2     4
 6     4
 7     3];
 %steps to replace counts of each element of column2 with it
 [a2_sorted, i_a2_sorted] = sort(a(:,2));
 [a2_sorted_unique, i_a2_sorted_unique] = unique(a2_sorted);
 h = hist(a2_sorted, a2_sorted_unique);
 %count = repelems(h, [1:numel(h); h]);%octave
 count = repelem(h, h);
 [~,a2_back_idx] = sort(i_a2_sorted);
 count = count (a2_back_idx);
 b = [a(:,1) , count.'];
 %counts shoule be sorted in descending order 
 %because the unique function extracts last element from each category
 [b_sorted i_b_sorted] =sortrows(b,[1 -2]);
 [~, i_b1_sorted_unique] = unique(b_sorted(:,1));
 c = [b_sorted(:,1) , a(i_b_sorted,2)];
 out = c(i_b1_sorted_unique,:)
 %more steps to recover the original order
 [~,b_back_idx] = sort(i_b_sorted);
 idx_logic = false(1,size(a,1));
 idx_logic(i_b1_sorted_unique) = true;
 idx_logic = idx_logic(b_back_idx);
 out = c(b_back_idx(idx_logic),:)

答案 1 :(得分:1)

  1. 根据左栏中的索引创建一个从右列中找到最小重复的函数:

    function Out = getMinDuplicate (Index, Data)
      Candidates = Data(Data(:,1) == Index, :); Candidates = Candidates(:, 2);
      Hist = histc (Data(:,2), [1 : max(Data(:,2))]);
      [~,Out] = min (Hist(Candidates)); Out = Candidates(Out);
    end
    
  2. 为第1列中的所有唯一值调用此函数:

    >> [unique(d(:,1)), arrayfun(@(x) getMinDuplicate(x, d), unique(d(:,1)))]
    ans =
         1     1
         2     2
         4     1
         5     4
         6     4
         7     3
         8     2
    
  3. (其中d是您的数据数组)。