rapide 2dimensional histograming dans matlab
J'ai écrit un histogramme 2D algorithme pour 2 matlab vecteurs. Malheureusement, je ne peux pas comprendre comment vectoriser, et il est d'environ un ordre de grandeur trop lent pour mes besoins. Voici ce que j'ai:
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
Pensées?
Merci!!
Jean
- Qu'est-ce que
fimg0
? - Faute de frappe. J'ai Fixé.
Vous devez vous connecter pour publier un commentaire.
Voici ma version pour un histogramme 2D:
Remarque que j'ai enlevé le "non négatif" de restriction, mais a gardé entier bin centres (ce qui peut être facilement changé en divisant gamme de taille tout aussi nombre spécifié de cycles au lieu des "fractions").
Cela a été principalement inspiré par @SteveEddins post de blog.
Xi = interp1(xbins, 1:xNumBins, X, 'nearest', 'extrap');
est plus simple (similaire pourY
). Depuis, c'était il y a quelques temps, je ne peux pas garantir il n'y a aucun cas de coin bien 🙂accumarray
? Ont à zéro de la tablette la plus courte des deux gammes, ou quelque chose, puisque le premier argument deaccumarray
a avoir des colonnes de longueur égale, à droite?[xct,xedge,xbin]=histcounts(x)
, puisaccumarray([xbin',ybin'],1,[numel(xedge),numel(yedge)])
fonctionne en gros, à part la mise à l'échelle des valeurs dans la corbeille de comte.histcounts
est le substitut moderne dehistc
je l'ai mentionné ci-dessus.Vous pourriez faire quelque chose comme:
(Note: pas testé)