如何根据一列元素的频率对矩阵的行进行排序?

时间:2015-08-07 09:55:20

标签: arrays matlab sorting matrix

我尝试在Matlab中使用sortrows函数。有没有办法使用这个函数或任何想法根据矩阵列的元素频率对矩阵的行进行排序。

作为一个例子:我有这个矩阵

matrix = [1 3 1;
          1 4 2;
          2 5 4;
          3 2 3; 
          5 5 4; 
          5 3 3; 
          4 3 2; 
          4 2 3; 
          3 6 4; 
          2 4 3];

我想得到类似的东西:

sorted_based_on_3rd_col = [2 4 3;
                           3 2 3;
                           4 2 3;
                           5 3 3;
                           2 5 4;
                           3 6 4;
                           5 5 4;
                           1 4 2;
                           4 3 2;
                           1 3 1]

基于第三列的最频繁元素排序。 谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

这是一种方式:

x = matrix(:,3);
[c,b] = histc(x,unique(x))
[~,idx] = sort(c(b),'descend')
out = matrix(idx,:)

答案 1 :(得分:3)

如果你不关心频率相等的元素的顺序,可以这样做:

>> freq = accumarray(matrix(:,3), 1);
>> [~, ind] = sort(freq(matrix(:, 3)), 1, 'descend');  % index that sorts matrix
>> matrix(ind, :)  % reshuffle matrix to sort

ans =

     3     2     3
     5     3     3
     4     2     3
     2     4     3
     2     5     4
     5     5     4
     3     6     4
     1     4     2
     4     3     2
     1     3     1

如果你关心,你需要先对矩阵进行预先排序。由于matlab的排序为stable,因此这将保留第二种排序中相同项的顺序。

>> matrix = sortrows(matrix, 1)

matrix =

     1     3     1
     1     4     2
     2     5     4
     2     4     3
     3     2     3
     3     6     4
     4     3     2
     4     2     3
     5     5     4
     5     3     3

>> freq = accumarray(matrix(:,3),1);
>> [~, ind] = sort(freq(matrix(:,3)), 1, 'descend');
>> matrix(ind, :)

ans =

     2     4     3
     3     2     3
     4     2     3
     5     3     3
     2     5     4
     3     6     4
     5     5     4
     1     4     2
     4     3     2
     1     3     1