source: issm/trunk/src/m/miscellaneous/prctile_issm.m@ 14310

Last change on this file since 14310 was 14310, checked in by Mathieu Morlighem, 12 years ago

merged trunk-jpl and trunk for revision 14308

File size: 1.4 KB
Line 
1%
2% wrapper for prctile to avoid using the matlab statistics toolbox.
3%
4function [y]=prctile_issm(x,p,dim)
5
6 try
7 y=prctile(argin{:});
8
9 catch me
10
11 if length(size(x)) > 2
12 error('Number of dimensions %d not implemented.',length(size(x)));
13 end
14 if ~exist('dim','var')
15 dim=0;
16 for i=1:length(size(x))
17 if ~dim && size(x,i)>1
18 dim=i;
19 end
20 end
21 if ~dim
22 dim=1;
23 end
24 end
25
26 psize=size(p);
27 if size(p,2)>1
28 p=transp(p);
29 end
30
31 xsize=size(x);
32 if dim==2
33 x=transp(x);
34 end
35
36% check for any NaN in any columns
37
38 if ~any(isnan(x))
39 x=sort(x,1);
40 n=size(x,1);
41
42% branch based on number of elements
43
44 if n>1
45
46% set up percent values and interpolate
47
48 xi=transp(100.*([1:n]-0.5)/n);
49 y=interp1q(xi,x,p);
50
51% fill in high and low values
52
53 y(p<xi(1),:)=repmat(x(1,:),nnz(p<xi(1)),1);
54 y(p>xi(n),:)=repmat(x(n,:),nnz(p>xi(n)),1);
55
56% if one value, just copy it
57
58 elseif n==1
59 y=repmat(x(1,:),length(p),1);
60
61% if no values, use NaN
62
63 else
64 y=repmat(NaN,size(p,1),size(x,2));
65 end
66
67 else
68
69% must loop over columns, since number of elements could be different
70
71 y=zeros(size(p,1),size(x,2));
72 for j=1:size(x,2)
73
74% remove any NaN and recursively call column
75
76 y(:,j)=prctile_issm(x(~isnan(x(:,j)),j),p);
77 end
78 end
79
80 if (min(xsize)==1 && xsize(dim)>1 && psize(2)>1) || ...
81 (min(xsize)> 1 && dim==2)
82 y=transp(y);
83 end
84 end
85
86end
87
Note: See TracBrowser for help on using the repository browser.