annotate sequences/@seq/meandata.m @ 61:eff6bddf82e3 tip

Finally implemented perceptual brightness thing.
author samer
date Sun, 11 Oct 2015 10:20:42 +0100
parents beb8a3f4a345
children
rev   line source
samer@3 1 function m=meandata(x,dim,varargin)
samer@3 2 % MEANDATA - Mean of a sequence of arrays
samer@3 3 %
samer@3 4 % meandata ::
samer@3 5 % seq [D] ~ sequence of E dimensional arrays of size D, ie D::[[E]]
samer@3 6 % I:[[N]->[E]] ~ array of dimension numbers (between 1 and E) to do mean over
samer@3 7 % options {
samer@3 8 % check_nans :: {0,1}/0 ~'whether to check for (and ignore) nans'
samer@3 9 % }
samer@3 10 % -> [R] ~ array of size R, where R=set(D,I,1).
samer@3 11 %
samer@3 12 % if X is a sequence of 5 x 12 x 50 arrays, then
samer@3 13 % M=meandata(X,[1,3])
samer@3 14 % returns a 1 x 12 array.
samer@3 15 %
samer@3 16 % Options: See ITERATE for applicable options
samer@3 17
samer@37 18 opts=options('check_nans',0,varargin{:});
samer@3 19
samer@3 20 S.total=0;
samer@3 21 S.count=0;
samer@3 22
samer@3 23 if opts.check_nans, % world of pain
samer@3 24 if isempty(dim)
samer@3 25 S=foldl(@mean0_nan_st,S,x,varargin{:});
samer@3 26 elseif isscalar(dim)
samer@3 27 S=foldl(@mean_nan_st,S,x,varargin{:});
samer@3 28 else
samer@3 29 S=foldl(@meandims_nan_st,S,x,varargin{:});
samer@3 30 end
samer@3 31 m=S.total./S.count;
samer@3 32 else
samer@3 33 if isempty(dim)
samer@3 34 S=foldl(@mean0_st,S,x,varargin{:});
samer@3 35 elseif isscalar(dim)
samer@3 36 S=foldl(@mean_st,S,x,varargin{:});
samer@3 37 else
samer@3 38 S=foldl(@meandims_st,S,x,varargin{:});
samer@3 39 end
samer@3 40 m=S.total/S.count;
samer@3 41 end
samer@3 42
samer@3 43
samer@3 44 % non-nan checking accumulators
samer@3 45 function S=meandims_st(S,X)
samer@3 46 S.total=S.total+sumdims(X,dim);
samer@3 47 S.count=S.count+prod(sizedims(X,dim));
samer@3 48 end
samer@3 49
samer@3 50 function S=mean_st(S,X)
samer@3 51 S.total=S.total+sum(X,dim);
samer@3 52 S.count=S.count+size(X,dim);
samer@3 53 end
samer@3 54
samer@3 55 function S=mean0_st(S,X)
samer@3 56 S.total=S.total+X;
samer@3 57 S.count=S.count+1;
samer@3 58 end
samer@3 59
samer@3 60 % nan checking accumulators
samer@3 61 function S=meandims_nan_st(S,X)
samer@3 62 I=isnan(X); X(I)=0;
samer@3 63 S.total=S.total+sumdims(X,dim);
samer@3 64 S.count=S.count+sumdims(~I,dim);
samer@3 65 end
samer@3 66
samer@3 67 function S=mean_nan_st(S,X)
samer@3 68 I=isnan(X); X(I)=0;
samer@3 69 S.total=S.total+sum(X,dim);
samer@3 70 S.count=S.count+sum(~I,dim);
samer@3 71 end
samer@3 72
samer@3 73 function S=mean0_nan_st(S,X)
samer@3 74 I=isnan(X); X(I)=0;
samer@3 75 S.total=S.total+X;
samer@3 76 S.count=S.count+(~I);
samer@3 77 end
samer@3 78 end
samer@3 79
samer@3 80