Matlab:在范围内查找模式

时间:2012-09-14 07:00:43

标签: matlab mode

我有一个矩阵,如:

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 个答案:

答案 0 :(得分:4)

您可以使用histc将数据分类到您想要的范围内,然后使用histc

的输出max找到成员最多的分档
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 :(得分:1)

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

...其中M将为您提供模式,F将为您提供出现频率

答案 2 :(得分: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
> 

答案 3 :(得分:1)

我想通过不同答案的数量,我们可能会错过你的目标。这是我的解释。

如果您想拥有多个范围并且想要为每个范围输出最常用的数字,请创建一个包含所有所需范围的单元格(它们可能重叠)并使用cellfun为每个范围运行模式()。您也可以使用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]