计算最常见的值

时间:2009-12-04 12:24:15

标签: matlab count matrix

如果我有一个矩阵A,其中n个值从65:90开始。如何获得A中最常见的10个值?我希望结果是一个10x2矩阵B,第一列中有10个常用值,第二列中出现的时间为。

5 个答案:

答案 0 :(得分:5)

A = [65 82 65 90; 90 70 72 82]; % Your data
range = 65:90;
res = [range; histc(A(:)', range)]'; % res has values in first column, counts in second.

现在你所要做的就是按第二列对res数组进行排序,然后取前10行。

sortedres = sortrows(res, -2); % sort by second column, descending
first10 = sortedres(1:10, :)

答案 1 :(得分:1)

使用arrayfun()

可以轻松解决这个问题
A = [...]; % Your target matrix with values 65:90
labels = 65:90 % Possible values to look for
nTimesOccured = arrayfun(@(x) sum(A(:) == x), labels);
[sorted sortidx] = sort(nTimesOccured, 'descend');

B = [labels(sortidx(1:10))' sorted(1:10)'];

答案 2 :(得分:1)

这也可以用accumarray来解决

ncounts = accumarray(A(:),1);  %ncounts should now be a 90 x 1 vector of counts
[vals,sidx] = sort(ncounts,'descend');   %vals has the counts, sidx has the number
B = [sidx(1:10),vals(1:10)];

accumarray并不像它应该的那么快,但通常比其他类型的操作更快。我花了很多关于其帮助页面的扫描来了解它到底在做什么。为了您的目的,它可能比histc解决方案慢,但更直接。

- 编辑:在accumarray电话中忘记了'1'。

答案 3 :(得分:1)

我们可以使用统计工具箱中的制表添加第四个选项:

A = randi([65 90], [1000 1]);   %# thousand random integers in the range 65:90
t = sortrows(tabulate(A), -2);  %# compute sorted frequency table
B = t(1:10, 1:2);               %# take the top 10

答案 4 :(得分:1)

哎呀,这是另一个解决方案,所有简单的内置命令

[V, I] = unique(sort(A(:)));
M = sortrows([V, diff([0; I])], -2);
Top10 = M(1:10, :);

第一行:对所有值进行排序,然后在排序列表中查找每个新值开始的偏移量。 第二行:计算每个唯一值的偏移差异,并对这些结果进行排序。

BTW,如果范围可能的数字非常大,我只建议使用此方法,例如[0,1E8]。在这种情况下,其他一些方法可能会出现内存不足错误。