Вы можете «уменьшить разрешение» своих данных, используя accumarray, где указывается, в какой выходной «бит» должна быть вставлена каждая точка, и укажите, что вы хотите взять среднее значение во всех точках в этом бункере.
Некоторые примеры данных:
% make points that overlap a lot
n = 10000
% NOTE: your points do not need to be sorted.
% I only sorted so we can visually see if the code worked,
% see the below plot
Xs = sort(rand(n, 1));
Ys = rand(n, 1);
temps = sort(rand(n, 1));
% plot
colormap("hot")
scatter(Xs, Ys, 8, temps)
(я только отсортирован по Xs
и temps
для того, чтобы получить образец полосатый выше, так что мы можем визуально проверить, является ли «уменьшить разрешение» работал)
Теперь предположим, что хочу уменьшить разрешение своих данных, получив только одну точку на 0.05
единиц в направлениях X и Y, являясь средним значением всех точек в что квадрат (так как мои X
и Y
идут от 0 до 1, я получу 20 * 20 баллов).
% group into bins of 0.05
binsize = 0.05;
% create the bins
xbins = 0:binsize:1;
ybins = 0:binsize:1;
Я использую histc
для работы, какие бен каждый X и Y в (обратите внимание - в этом случае, так как бункеры регулярны я мог бы также сделать idxx = floor((Xs - xbins(1))/binsize) + 1
)
% work out which bin each X and Y is in (idxx, idxy)
[nx, idxx] = histc(Xs, xbins);
[ny, idxy] = histc(Ys, ybins);
Затем я использую accumarray
для сделать среднее temps
в пределах каждого бина:
% calculate mean in each direction
out = accumarray([idxy idxx], temps', [], @mean);
(Примечание - это означает, что точка в temps(i)
принадлежит «пикс el "(нашей выходной матрицы) в строке idxy(1)
столбец idxx(1)
. Я сделал [idxy idxx]
в отличие от [idxx idxy]
так, что результирующая матрица имеет Y == строк и столбцов X ==))
Вы можете построить так:
% PLOT
imagesc(xbins, ybins, out)
set(gca, 'YDir', 'normal') % flip Y axis back to normal
Или как разбросом сюжет, как это (я сюжет каждой точки в средней точке «пиксель», и обратил исходные точки данных слишком для сравнения):
xx = xbins(1:(end - 1)) + binsize/2;
yy = ybins(1:(end - 1)) + binsize/2;
[xx, yy] = meshgrid(xx, yy);
scatter(Xs, Ys, 2, temps);
hold on;
scatter(xx(:), yy(:), 20, out(:));
Этот ответ потрясающий!Спасибо огромное! Я пару раз работал с вашим решением, и я могу получить именно то, что хочу. Я собираюсь поработать над своим представителем, чтобы я мог подняться, спасибо еще раз !!! –