Vectorized Binning in Matlab

In fluids modeling, a really easy way to build an model of a scalar (e.g., a polutant or chemical) that is transported by a flowfield is using a particle tracking model.

Here, you have millions of finite particles, with x and y locations (and possibly mass).  building code to advect the particles by the flow-field and diffuse them based on a random walk Gaussian diffusion model is pretty trivial.

What's hard is when you want to actually make sense of these millions of particles: you need to convert them into a concentration. How many particles are in a unit of space?  Binning codes are usually pretty slow, and can be the major hold-up in a particle tracking model.

That's why I was stoked yesterday to find MATLAB's accumarray function.  It offers a quick way to bin particles, and operates slightly (10-15%) faster than my old bench-mark binning code.   Here's my binning function for anybody who's interested:


function [Conc]=bin_Particles(Xpos,Ypos,Ms,L,dx)
% PDF2d(C1, C2, nBins)
% Written By: Mike Soltys (
% Last modified: 4/25/13
% Required Inputs:
%   Xpos:         1 x n vector of particles X locations.
%   Ypos:         1 x n vector of particles y locations.
%   Ms:           1 x n vector of particles masses
%   L:            The domain will reach from -L to L in both x and y
%   dx:           The domain will be broken into dx sized bits.
% output:
%   Conc:     a (2L/dx+1) X (2L/dx+1) matrix with concentrations

%Detrmine Bin Locations
    Xs=round(( Xpos+L)*L/dx )+1;Xs(Xs<1)=1;Xs(Xs>(1+2*L/dx))=(1+2*L/dx);
    Ys=round(( Ypos+L)*L/dx )+1;Ys(Ys<1)=1;Ys(Ys>(1+2*L/dx))=(1+2*L/dx);

%Use accumarray to create matrix.
	Conc(:,:)=accumarray([Ys, Xs],Ms);