Matlab: режим поиска в диапазоне

У меня есть матрица, как:

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 ответа

Решение

Ты можешь использовать histc объединить ваши данные в диапазоны по вашему желанию, а затем найти корзину с большинством членов, используя max на выходе histc

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.

Я думаю, по количеству разных ответов мы можем упустить вашу цель. Вот моя интерпретация.

Если вы хотите иметь много диапазонов и хотите вывести наиболее частое число для каждого диапазона, создайте ячейку, содержащую все требуемые диапазоны (они могут перекрываться), и используйте 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]
> 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
> 
[M,F] = mode(  A((A>=2) & (A<=5))  ) %//only interested in range 2 to 5

... где M даст вам режим, а F даст вам частоту появления

Другие вопросы по тегам