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 方向の単位ごとに 1 つのポイントのみを取得して、データの解像度を下げたいとします。これは、その正方形内のすべてのポイントの平均です (つまり、0 から 1 に移動するため、取得しX
ますY
合計 20*20 ポイント)。
% group into bins of 0.05
binsize = 0.05;
% create the bins
xbins = 0:binsize:1;
ybins = 0:binsize:1;
XとYのそれぞれがどのビンに入っているかを調べるために使用histc
します(注-この場合、ビンは規則的であるため、私も行うことができます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);
(注 - これは、ポイントが(出力マトリックスの) 行columntemps(i)
の「ピクセル」に属していることを意味します。結果のマトリックスが Y == 行と X == 列になるようにするのとは対照的に行いました))idxy(1)
idxx(1)
[idxy idxx]
[idxx idxy]
次のようにプロットできます。
% 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(:));