2017-11-04 103 views
2

加權一維直方圖看起來非常直截了當。我怎樣才能實現一個二維加權直方圖給出一個權重矢量,w如何創建加權二維直方圖

MATLAB:

x = randn(4,1);   //some random x input 
y = randn(4,1);   //some random y input 
w = [10, 20, 30, 40];  //weight to be assigned to corresponding data point in the generated histogram, i.e. the pixel intensity value 

figure; 
H = histogram2(x,y); //Matlab built-in 2D histogram 

我應該如何在上面的代碼片斷使用瓦特得到一個加權2D直方圖功能。

* MATLAB代碼是首選,但也可能接受Python。

+0

嗨。例如,如果您有4個值對,那麼爲什麼要使用64個NBINS呢?無論如何,解決方案並不像x = x。* w那麼簡單。 Y = Y *瓦特; ?這樣,第一排得到更低的重量等。 –

+0

不完全。 x,y應給出直方圖變換後的投影座標。該2D平面中每個數據點的實際像素值應取對應的w值。至於垃圾箱,我通過刪除Nbin來簡化了這個問題。 – nikk

回答

0

我分享我的加權2D直方圖,我從我的一些舊的代碼了...

function f = hist2dw(x,y,weights,xedges,yedges) 
%all inputs should be vectors 
[~,xbin] = histc(x,xedges); 
[~,ybin] = histc(y,yedges); 

xbin(xbin==0) = inf; 
ybin(ybin==0) = inf; 
xnbin = numel(xedges); 
ynbin = numel(yedges); 

xy = xbin * ynbin + ybin; 

[xyu,id] = unique(xy); 
xyu(end) = []; % remove Inf bin 
id(end) = []; 
hstres = histc(xy,xyu); 
hstres = hstres.*weights(id); % add the weights to the histogram 
f(ynbin,xnbin)=0; % preallocate memory 
f(xyu-ynbin) = hstres; 

,這裏是如何使用它的一個例子:

x = rand(1000,1); 
y = rand(1000,1); 
w=[ones(900,1) ; 5*ones(100,1) ]; 
edg=0:0.01:1; 

imagesc(edg,edg,hist2dw(x(:),y(:),w(:),edg,edg));colorbar 

enter image description here

+0

謝謝bla,你的代碼輸出看起來不錯。但是,您可以解釋發生了什麼,而不是將您的功能傾倒到我的程序中?或者更好 - 爲了未來解決方案尋求者的利益 - 簡化解決方案以匹配原始問題的形式? – nikk

+0

讓我們先看看我們應該從哪裏開始,你明白'histc'做什麼? – bla

+0

我明白它的作用。 – nikk