Matlab:查找范围内的众数

3

我有一个矩阵,像这样:

A=
    10 31 32 22
    32 35 52 77
    68 42 84 32

我需要一个类似于mode的函数,但它需要有范围限制。比如说,当我调用mymode(A,10)时,它会返回30,也就是在0-10、10-20、20-30等范围内出现最频繁的数字,并返回该范围内出现次数最多的数字。

4个回答

4
你可以使用 histc 将数据分成你想要的范围,并使用 maxhistc 的输出中找到拥有最多元素的 bin。
ranges = 0:10:50;                 % your desired ranges
[n, bins] = histc(A(:), ranges);  % bin the data
[v,i] = max(n);                   % find the bin with most occurrences

[ranges(i) ranges(i+1)]           % edges of the most frequent bin

针对你的具体示例,这将返回

ans =

    30    40

由于A中大部分的值都在30到40之间,因此需要与您所需的输出相匹配。


1
[M,F] = mode(  A((A>=2) & (A<=5))  ) %//only interested in range 2 to 5

...其中M将给出模式,F将给出出现频率


1
> A = [10 31 32 22; 32 35 52 77; 68 42 84 32]
A =

   10   31   32   22
   32   35   52   77
   68   42   84   32

> min = 10
min =  10
> max = 40
max =  40
> mode(A(A >= min & A <= max))
ans =  32
> 

1

根据不同的答案数量,我猜我们可能没有理解你的目标。这是我的解释。

如果您想要有许多范围,并且希望输出每个范围中最常见的数字,请创建一个包含所有所需范围(它们可以重叠)的单元格,并使用cellfun在每个范围上运行mode()。您也可以使用类似的方式使用arrayfun创建包含所需范围的单元格:

A = [10 31 32 22; 32 35 52 77; 68 42 84 32];

% create ranges
range_step = 10;
range_start=[0:range_step:40];
range=arrayfun(@(r)([r r+range_step]), range_start, 'UniformOutput', false)

% analyze ranges
o = cellfun(@(r)(mode(A(A>=r(1) & A<=r(2)))), range, 'UniformOutput', false)

o = 
[10]    [10]    [22]    [32]    [42]

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