veloce istogramma bidimensionale in MATLAB

Ho scritto un algoritmo di istogramma 2D per 2 vettori matlab. Sfortunatamente, non riesco a capire come vettorializzare, e si tratta di un ordine di grandezza troppo lento per le mie esigenze. Ecco cosa ho:

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 

Pensieri?

Grazie!! John

Ecco la mia versione per un istogramma 2D:

 %# some random data X = randn(2500,1); Y = randn(2500,1)*2; %# bin centers (integers) xbins = floor(min(X)):1:ceil(max(X)); ybins = floor(min(Y)):1:ceil(max(Y)); xNumBins = numel(xbins); yNumBins = numel(ybins); %# map X/Y values to bin indices Xi = round( interp1(xbins, 1:xNumBins, X, 'linear', 'extrap') ); Yi = round( interp1(ybins, 1:yNumBins, Y, 'linear', 'extrap') ); %# limit indices to the range [1,numBins] Xi = max( min(Xi,xNumBins), 1); Yi = max( min(Yi,yNumBins), 1); %# count number of elements in each bin H = accumarray([Yi(:) Xi(:)], 1, [yNumBins xNumBins]); %# plot 2D histogram imagesc(xbins, ybins, H), axis on %# axis image colormap hot; colorbar hold on, plot(X, Y, 'b.', 'MarkerSize',1), hold off 

hist2d

Si noti che ho rimosso la restrizione “non negativa”, ma conservato i centri dei bin interi (questo potrebbe essere facilmente modificato in un intervallo di divisione in un numero specificato di bin di dimensioni uguali invece di “frazioni”).

Questo è stato principalmente ispirato al post sul blog di @SteveEddins.

Potresti fare qualcosa come:

 max0 = max(fvec0) + 1; max1 = max(fvec1) + 1; % Combine the vectors combined = fvec0 + fvec1 * max0; % Generate a 1D histogram hist_1d = hist(combined, max0*max1); % Convert back to a 2D histogram hist_2d = reshape(hist, [max0 max1]); 

(Nota: non testata)