Histogram from function or data

Nick Trefethen, May 2011

(Chebfun example stats/Histogram.m)

function Histogram

Suppose we have a chebfun, like this one:

x = chebfun('x',[0,10]);
f = x/3 + cos(2*x) + .5*sin(x.^2) + .2*sin(27*x);
LW = 'linewidth';
plot(f,LW,1), hold on

and we have some bins defined by bin edges, like these:

edges = 0:10;

and we want to 'bin' f into these bins. Here is a "histogram" function that will do something along these lines. In each bin, the value it stores is the total integral of f in that interval.

function h = hist(f,edges)
    nbins = length(edges)-1;
    data = zeros(nbins,1);
    fsum = cumsum(f);
    for k = 1:nbins
        a = edges(k); b = edges(k+1);
        data(k) = fsum(b)-fsum(a);
    h = chebfun(num2cell(data),edges);

If we apply the function to our data, we get a histogram represented as a piecewise constant chebfun:

h = hist(f,edges);

What if we wanted to start from data points rather than a function? Chebfun would allow us to do this with delta functions, like this:

npts = 50; xpts = 5+randn(npts,1);
f2 = 0*x;
for j = 1:npts
    f2 = f2 + dirac(x-xpts(j));
hold off
edges = 0:.5:10;
h = hist(f2,edges);
hold on, plot(h,'r',LW,2)

This is an extremely inefficient way to work with data, but it illustrates some of the ways in which chebfuns can be manipulated.

Perhaps an overload of Matlab's HIST command should be included in Chebfun Version 5. Such an overload would certainly not use delta functions internally, and it would require some careful thinking about appropriate definitions.