您可以使用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
排序)
現在,假設我想通過在X和Y方向上每個0.05
單位獲得一個點來降低我的數據的分辨率,這是所有點的平均值該廣場(因爲我的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)
點屬於「PIX el「(我們的輸出矩陣)在行idxy(1)
列idxx(1)
。我做了[idxy idxx]
,而不是[idxx idxy]
,這樣生成的矩陣具有Ÿ==行和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(:));
這個答案太神奇了!非常感謝!我已經玩了幾天你的解決方案,我能夠得到我想要的。我會去工作我的代表,讓我可以upvote,再次感謝! –