wolffd@0: function varargout = mirhisto(x,varargin) wolffd@0: % h = mirhisto(x) constructs the histogram from x. The elements of x are wolffd@0: % binned into equally spaced containers. wolffd@0: % Optional argument: wolffd@0: % mirhisto(...,'Number',n): specifies the number of containers. wolffd@0: % Default value : n = 10. wolffd@0: % mirhisto(...,'Ampli'): adds the amplitude of the elements,instead of wolffd@0: % simply counting then. wolffd@0: wolffd@0: wolffd@0: n.key = 'Number'; wolffd@0: n.type = 'Integer'; wolffd@0: n.default = 10; wolffd@0: option.n = n; wolffd@0: wolffd@0: a.key = 'Ampli'; wolffd@0: a.type = 'Boolean'; wolffd@0: a.default = 0; wolffd@0: option.a = a; wolffd@0: wolffd@0: specif.option = option; wolffd@0: wolffd@0: wolffd@0: varargout = mirfunction(@mirhisto,x,varargin,nargout,specif,@init,@main); wolffd@0: wolffd@0: wolffd@0: function [x type] = init(x,option) wolffd@0: type = 'mirhisto'; wolffd@0: wolffd@0: wolffd@0: function h = main(x,option,postoption) wolffd@0: if iscell(x) wolffd@0: x = x{1}; wolffd@0: end wolffd@0: d = get(x,'Data'); wolffd@0: %disp('Computing histogram...') wolffd@0: ddd = cell(1,length(d)); wolffd@0: bbb = cell(1,length(d)); wolffd@0: for i = 1:length(d) wolffd@0: di = d{i}{1}; % To be generalized for segmented data wolffd@0: if iscell(di) wolffd@0: mx = -Inf; wolffd@0: mn = Inf; wolffd@0: nc = size(di,2); wolffd@0: for k = 1:nc wolffd@0: dk = di{k}; wolffd@0: if size(dk,4) == 2 wolffd@0: dk(end+1:end*2,:,:,1) = dk(:,:,:,2); wolffd@0: dk(:,:,:,2) = []; wolffd@0: end wolffd@0: mxk = max(dk); wolffd@0: mnk = min(dk); wolffd@0: if mxk > mx wolffd@0: mx = mxk; wolffd@0: end wolffd@0: if mnk < mn wolffd@0: mn = mnk; wolffd@0: end wolffd@0: end wolffd@0: if isinf(mx) || isinf(mx) wolffd@0: b = []; wolffd@0: dd = []; wolffd@0: else wolffd@0: dd = zeros(1,option.n); wolffd@0: if mn == mx wolffd@0: b(1,:) = mn-ceil(option.n/2) : mn+floor(option.n/2); wolffd@0: else wolffd@0: b(1,:) = mn : (mx-mn)/option.n : mx; wolffd@0: end wolffd@0: for k = 1:nc wolffd@0: dk = di{k}; wolffd@0: for j = 1:option.n wolffd@0: found = find(and(dk>=b(1,j),dk<=b(1,j+1))); wolffd@0: if option.a wolffd@0: dd(1,j) = dd(1,j) + sum(dk(found)); wolffd@0: else wolffd@0: dd(1,j) = dd(1,j) + length(found); wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: else wolffd@0: if isa(x,'mirscalar') wolffd@0: di = permute(di,[3 2 1]); wolffd@0: end wolffd@0: if size(di,4) == 2 wolffd@0: di(end+1:end*2,:,:,1) = di(:,:,:,2); wolffd@0: di(:,:,:,2) = []; wolffd@0: end wolffd@0: nl = size(di,1); wolffd@0: nc = size(di,2); wolffd@0: np = size(di,3); wolffd@0: dd = zeros(1,option.n,np); wolffd@0: for l = 1:np wolffd@0: mx = max(max(di(:,:,l),[],1),[],2); wolffd@0: mn = min(min(di(:,:,l),[],1),[],2); wolffd@0: b(l,:) = mn:(mx-mn)/option.n:mx; wolffd@0: for k = 1:nc wolffd@0: dk = di(:,k,l); wolffd@0: for j = 1:option.n wolffd@0: found = (find(and(dk>=b(l,j),dk<=b(l,j+1)))); wolffd@0: if option.a wolffd@0: dd(1,j,l) = dd(1,j,l) + sum(dk(found)); wolffd@0: else wolffd@0: dd(1,j,l) = dd(1,j,l) + length(found); wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: end wolffd@0: ddd{i} = ipermute(dd,[3 2 1]); wolffd@0: bbb{i}(:,:,1) = b(:,1:end-1); wolffd@0: bbb{i}(:,:,2) = b(:,2:end); wolffd@0: end wolffd@0: h = class(struct,'mirhisto',mirdata(x)); wolffd@0: h = purgedata(h); wolffd@0: h = set(h,'Bins',bbb,'Weight',ddd);