您可以使用accumarray来“降低数据的分辨率”,您可以在其中指定每个点应该进入哪个输出“bin”,并指定您希望对该 bin 中的所有点取平均值。
一些示例数据:
% 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);
然后我用在每个 bin 内accumarray
做一个平均值:temps
% calculate mean in each direction
out = accumarray([idxy idxx], temps', [], @mean);
(注意 - 这意味着 in 的点temps(i)
属于行列处的“像素”(我们的输出矩阵)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(:));