diff toolboxes/MIRtoolbox1.3.2/MIRToolbox/@mirhisto/mirhisto.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toolboxes/MIRtoolbox1.3.2/MIRToolbox/@mirhisto/mirhisto.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,117 @@
+function varargout = mirhisto(x,varargin)
+%   h = mirhisto(x) constructs the histogram from x. The elements of x are
+%       binned into equally spaced containers.
+%   Optional argument:
+%       mirhisto(...,'Number',n): specifies the number of containers.
+%           Default value : n = 10.
+%       mirhisto(...,'Ampli'): adds the amplitude of the elements,instead of
+%           simply counting then.
+
+
+        n.key = 'Number';
+        n.type = 'Integer';
+        n.default = 10;
+    option.n = n;
+    
+        a.key = 'Ampli';
+        a.type = 'Boolean';
+        a.default = 0;
+    option.a = a;
+    
+specif.option = option;
+
+
+varargout = mirfunction(@mirhisto,x,varargin,nargout,specif,@init,@main);
+
+
+function [x type] = init(x,option)
+type = 'mirhisto';
+
+
+function h = main(x,option,postoption)
+if iscell(x)
+    x = x{1};
+end
+d = get(x,'Data');
+%disp('Computing histogram...')
+ddd = cell(1,length(d));
+bbb = cell(1,length(d));
+for i = 1:length(d)
+    di = d{i}{1};  % To be generalized for segmented data
+    if iscell(di)
+        mx = -Inf;
+        mn = Inf;
+        nc = size(di,2);
+        for k = 1:nc
+            dk = di{k};
+            if size(dk,4) == 2
+                dk(end+1:end*2,:,:,1) = dk(:,:,:,2);
+                dk(:,:,:,2) = [];
+            end
+            mxk = max(dk);
+            mnk = min(dk);
+            if mxk > mx
+                mx = mxk;
+            end
+            if mnk < mn
+                mn = mnk;
+            end
+        end
+        if isinf(mx) || isinf(mx)
+            b = [];
+            dd = [];
+        else
+            dd = zeros(1,option.n);
+            if mn == mx
+                b(1,:) = mn-ceil(option.n/2) : mn+floor(option.n/2);
+            else
+                b(1,:) = mn : (mx-mn)/option.n : mx;
+            end
+            for k = 1:nc
+                dk = di{k};
+                for j = 1:option.n
+                    found = find(and(dk>=b(1,j),dk<=b(1,j+1)));
+                    if option.a
+                        dd(1,j) = dd(1,j) + sum(dk(found));
+                    else
+                        dd(1,j) = dd(1,j) + length(found);
+                    end
+                end
+            end
+        end
+    else
+        if isa(x,'mirscalar')
+            di = permute(di,[3 2 1]);
+        end
+        if size(di,4) == 2
+            di(end+1:end*2,:,:,1) = di(:,:,:,2);
+            di(:,:,:,2) = [];
+        end
+        nl = size(di,1);
+        nc = size(di,2);
+        np = size(di,3);
+        dd = zeros(1,option.n,np);
+        for l = 1:np
+            mx = max(max(di(:,:,l),[],1),[],2);
+            mn = min(min(di(:,:,l),[],1),[],2);
+            b(l,:) = mn:(mx-mn)/option.n:mx;
+            for k = 1:nc
+                dk = di(:,k,l);
+                for j = 1:option.n
+                    found = (find(and(dk>=b(l,j),dk<=b(l,j+1))));
+                    if option.a
+                        dd(1,j,l) = dd(1,j,l) + sum(dk(found));
+                    else
+                        dd(1,j,l) = dd(1,j,l) + length(found);
+                    end
+                end
+            end
+        end
+    end
+    ddd{i} = ipermute(dd,[3 2 1]);
+    bbb{i}(:,:,1) = b(:,1:end-1);
+    bbb{i}(:,:,2) = b(:,2:end);
+end
+h = class(struct,'mirhisto',mirdata(x));
+h = purgedata(h);
+h = set(h,'Bins',bbb,'Weight',ddd);
\ No newline at end of file