%% 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); end h = chebfun(num2cell(data),edges); end %% % If we apply the function to our data, we get a histogram represented % as a piecewise constant chebfun: h = hist(f,edges); plot(h,'r',LW,2) %% % 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)); end hold off plot(xpts,0*xpts,'.k','markersize',10) edges = 0:.5:10; h = hist(f2,edges); hold on, plot(h,'r',LW,2) ylim([-1,max(h)+1]) %% % 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. end