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
|