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

4

我尝试在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]

根据第三列中最频繁的元素进行排序。 感谢任何帮助!

相同的数字按什么顺序选择?基于第三列排序后的前4个条目是如何排序的? - Ander Biguri
@AnderBiguri 实际上这个输出没有区别。我认为我可以稍后通过第一列或第二列对它们进行排序。对吗? - Jose
你不能对一个算法说“用这个随便做点什么”。选择一种你要它们排序的方式! - Ander Biguri
可能需要使用类似于accumarray的函数,然后构建一个包含对accumarray的查找的第四列,按照第四列排序,最后再删除第四列。(抱歉没有代码。) - rwong
@AnderBiguri 好的。前4项应按第一列升序排序。 - Jose
2个回答

4

这是一种方法:

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

2
histc的第二个输出--想得周到! - Luis Mendo
@thewaywewalk非常感谢您的回答。它完全正确和有用,但我只能选择一个最佳答案。 - Jose

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的排序是稳定的,因此这将保留第二个排序相等项目的顺序。
>> 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接