按每个值出现的次数对向量进行排序

4
我们有以下情况:
    Q = [idxcell{:,1}];     
    Sort = sort(Q,'descend')                                                                                                                       
    Sort =
          Columns 1 through 13
            23    23    22    22    20    19    18    18    18    18    17    17    17
          Columns 14 through 26
            15    15    14    14    13    13    13    12    12    12    11    10     9
          Columns 27 through 39
             9     9     8     8     8     8     8     7     7     7     7     7     7
          Columns 40 through 52
             7     6     6     6     5     4     4     3     3     3     3     2     2
          Columns 53 through 64
             2     2     2     2     2     2     2     1     1     1     1     1

我们如何根据值重复的次数对矩阵进行排序?
期望的结果应该是:
repeatedSort =  2(9) 7(7) 1(5) 8(5) 3(4) 18(4) 6(3) 9(3) 12(3) 13(3) 17(3) 4(2) 14(2) 15(2) 22(2) 23(2) 5(1) 10(1) 11(1) 19(1) 20(1)
      or 
repeatedSort = 2 7 1 8 3 18 6 9 12 13 17 4 14 15 22 23 5 10 11 19 20

谢谢你的提前感谢。

数值范围是否有限制,例如从0到1000之间?如果是的话,您可以对它们进行桶排序。 - datdo
@datdo 在这种情况下,它是有限制的,最多100个。 - professor
糟糕,我误读了问题。桶排序不是解决方案,它只会返回相同的向量。 - datdo
2个回答

4
你可以使用统计工具箱中的TABULATE函数,然后调用SORTROWS按频率排序。
示例:
x = randi(10, [20 1]);    %# random values
t = tabulate(x);          %# unique values and counts
t = t(find(t(:,2)),1:2);  %# get rid of entries with zero count
t = sortrows(t, -2)       %# sort according to frequency

结果,第一列是唯一值,第二列是它们的计数:

t =
     2     4     %# value 2 appeared four times
     5     4     %# etc...
     1     3
     8     3
     7     2
     9     2
     4     1
     6     1

谢谢,这个解决方案也非常有效。@Amro - professor

3
以下是一种实现方式:
d      = randi(10,1,30); %Some fake data
n      = histc(d,1:10);
[y,ii] = sort(n,'descend');

disp(ii) % ii is now sorted according to frequency

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