Сортировка предметов по корзинам в MATLAB

Если у меня есть набор данных Y и набор бинов с центром в X, я могу использовать команду HIST, чтобы найти, сколько каждого Y находится в каждом бине.

N = hist(Y,X)

Я хотел бы знать, есть ли встроенная функция, которая может сказать мне, в какую ячейку входит каждый Y, поэтому

[N,I] = histMod(Y,X)

будет означать, что Y(I == 1) вернет все Y в ячейке 1 и т. д.

Я знаю, как написать эту функцию, поэтому мне интересно, есть ли уже встроенная функция в MATLAB, которая делает это.


person Marc    schedule 30.09.2010    source источник


Ответы (2)


Связанная функция histc делает это, но требует, чтобы вы определили края бинов, а не центры бинов.

Y = rand(1, 10);
edges = .1:.1:1;
[N, I] = histc(Y, edges);

Вычисление ребер с учетом бинцентров тоже несложно. В одном вкладыше:

N = hist(Y, X);

становится

[Nc, Ic] = histc(Y, [-inf X(1:end-1) + diff(X)/2, inf]);

с Nc == N плюс одна дополнительная пустая ячейка в конце (поскольку я предполагаю, что ни одно значение в Y не соответствует inf). См. doc histc.

person catchmeifyoutry    schedule 30.09.2010
comment
На самом деле преобразование между центрами бинов и краями бинов нетривиально, если центры бинов расположены неравномерно. Я думаю, что команда MATLAB's hist на самом деле ошибается. Но да, этого достаточно. Спасибо. - person Marc; 30.09.2010
comment
В настоящее время документация Matlab рекомендует использовать discretize для получения Ic в этом примере. - person alexandre iolov; 02.10.2018

Если кого-то устроит использование краев контейнеров вместо контейнеров,

[N,bin] = histc(y,binedges)

работает. Ааааа, MATLAB, твои определения функций настолько неинтуитивны

person Marc    schedule 30.09.2010