Сортировка 2D-координат по бинам в MATLAB

Я пытаюсь отсортировать случайные координаты в 2D-декартовой сетке, используя MATLAB, в «ячейки», определенные сеткой.

Например, если у меня есть 2D-домен с X в диапазоне от [-1,1] и Y от [-1,1] и я генерирую некоторые случайные координаты в домене, как я могу «подсчитать», сколько координат попадает в каждый квадрант ?

Я понимаю, что операторы for и if можно использовать для определения того, находится ли каждая координата в пределах квадрантов, но я хотел бы масштабировать это до гораздо более крупных квадратных сеток, которые имеют более 4 квадрантов.

Любой краткий и эффективный подход будет оценен по достоинству!


person Community    schedule 27.06.2014    source источник
comment
попробуйте этот код двумерной гистограммы: stackoverflow.com/a/6778256/97160   -  person Amro    schedule 27.06.2014
comment
Почему бы просто не использовать встроенный hist3?   -  person Luis Mendo    schedule 27.06.2014
comment
@LuisMendo: в отличие от histc, hist3 не возвращает индексы бинов, где была назначена каждая точка, он только вычисляет двумерную гистограмму (подсчитывает в каждом бин). Думайте о hist3 как о двухмерной версии функции hist. Обратите внимание, что для hist3 требуется набор инструментов статистики... К вашему сведению, на файловом обмене есть histcn который использует тот же метод, который я показал, чтобы расширить его до N-мерного   -  person Amro    schedule 30.06.2014
comment
@ Амро Спасибо за ваш ответ. Я думал, что ОП хочет только подсчитать, сколько значений находится в каждой ячейке, а не знать ячейку для каждого значения. В любом случае, ваш ответ великолепен, вы уже получили мой +1 :-)   -  person Luis Mendo    schedule 30.06.2014


Ответы (1)


Ниже приведен пример, адаптированный из кода, который я упомянул.

Полученные в результате бинарные точки сохраняются в переменной subs; Каждая строка содержит 2d нижних индекса бина, которому была назначена точка.

% 2D points, both coordinates in the range [-1,1]
XY = rand(1000,2)*2 - 1;

% define equal-sized bins that divide the [-1,1] grid into 10x10 quadrants
mn = [-1 -1]; mx = [1 1];  % mn = min(XY); mx = max(XY);
N = 10;
edges = linspace(mn(1), mx(1), N+1);

% map points to bins
% We fix HISTC handling of last edge, so the intervals become:
% [-1, -0.8), [-0.8, -0.6), ..., [0.6, 0.8), [0.8, 1]
% (note the last interval is closed on the right side)
[~,subs] = histc(XY, edges, 1); 
subs(subs==N+1) = N;

% 2D histogram of bins count
H = accumarray(subs, 1, [N N]);

% plot histogram
imagesc(H.'); axis image xy
set(gca, 'TickDir','out')
colormap gray; colorbar
xlabel('X'); ylabel('Y')

% show bin intervals
ticks = (0:N)+0.5;
labels = strtrim(cellstr(num2str(edges(:),'%g')));
set(gca, 'XTick',ticks, 'XTickLabel',labels, ...
    'YTick',ticks, 'YTickLabel',labels)

% plot 2D points on top, correctly scaled from [-1,1] to [0,N]+0.5
XY2 = bsxfun(@rdivide, bsxfun(@minus, XY, mn), mx-mn) * N + 0.5;
line(XY2(:,1), XY2(:,2), 'LineStyle','none', 'Marker','.', 'Color','r')

2d_bins

person Amro    schedule 27.06.2014
comment
Спасибо, Амро, это и ваш предыдущий комментарий действительно помогли! - person ; 28.06.2014
comment
@akshayjd: извините, была опечатка: мы должны были переставить матрицу H при отображении ее в виде изображения. Я исправил код и внес небольшие изменения. - person Amro; 30.06.2014