schnelle 2-dimensionale histograming in matlab
Ich geschrieben habe, ein 2D-Histogramm-Algorithmus für 2 matlab-Vektoren. Ich kann leider nicht herausfinden, wie zu Vektorisieren, und es ist etwa eine Größenordnung zu langsam für meine Bedürfnisse. Hier ist, was ich habe:
function [ result ] = Hist2D( vec0, vec1 )
%Hist2D takes two vectors, and computes the two dimensional histogram
% of those images. It assumes vectors are non-negative, and bins
% are the integers.
%
% OUTPUTS
% result -
% size(result) = 1 + [max(vec0) max(vec1)]
% result(i,j) = number of pixels that have value
% i-1 in vec0 and value j-1 in vec1.
result = zeros(max(vec0)+1, max(vec1)+1);
fvec0 = floor(vec1)+1;
fvec1 = floor(vec0)+1;
% UGH, This is gross, there has to be a better way...
for i = 1 : size(fvec0);
result(fvec0(i), fvec1(i)) = 1 + result(fvec0(i), fvec1(i));
end
end
Gedanken?
Dank!!
John
- Was ist
fimg0
? - Typo. Ich habe die Feste.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist meine version für ein 2D-Histogramm:
Beachten Sie, dass ich entfernt die "nicht-negativen" Einschränkung, sondern hielt integer bin-Zentren (das könnte leicht geändert werden, in dividing range in gleich große angegebene Anzahl der Plätze statt "Fraktionen").
Dies war vor allem inspiriert von @SteveEddins blog-post.
Xi = interp1(xbins, 1:xNumBins, X, 'nearest', 'extrap');
ist einfacher (ähnlich wie fürY
). Da dies einige Zeit her ist, kann ich nicht garantieren, es gibt keine Ecke Fälle obwohl 🙂accumarray
? Zu null-pad die kürzere der beiden Bereiche, oder etwas, da das erste argumentaccumarray
hat, um die Spalten gleich lang, richtig?[xct,xedge,xbin]=histcounts(x)
, dannaccumarray([xbin',ybin'],1,[numel(xedge),numel(yedge)])
funktioniert im Prinzip, abgesehen von der Skalierung der Werte in die bin-Anzahl.histcounts
ist der moderne Ersatz vonhistc
ich oben erwähnt.Könnte man etwas machen wie:
(Hinweis: ungetestet)