1 | %'pdf2stat': calculate statistics from pdf
|
---|
2 | %
|
---|
3 | %OUTPUT:
|
---|
4 | % VarVal(13,nb_component):statistics for each of the input components
|
---|
5 | % line 1: 'SampleNbre': nbe of samples (sum of pdf_val)
|
---|
6 | % line 2: 'BinSize'
|
---|
7 | % line 3: 'Mean': mean value
|
---|
8 | % line 4: 'RMS': root mean square deviation from mean
|
---|
9 | % line 5: 'Skewness': third order moment normalized by (rms)^3
|
---|
10 | % line 6: 'Kurtosis': : fourth order moment normalized by (rms)^4 (= 3 for a Gaussian)
|
---|
11 | % line 7: 'Min': min value
|
---|
12 | % statistics for the centered variable (x-mean)
|
---|
13 | % line 8: 'FirstCentile': first centile
|
---|
14 | % line 9: 'FirstDecile'
|
---|
15 | % line 10: 'Median'
|
---|
16 | % line 11: 'LastDecile'
|
---|
17 | % line 12: 'LastCentile'
|
---|
18 | % line 13: 'Max'
|
---|
19 | %
|
---|
20 | % INPUT:
|
---|
21 | % x(nb_bin): column vector representing the set of variable values for each bin of the histogram
|
---|
22 | % pdf_val(nb_bin,nb_component): values of the histogram at each bin x,
|
---|
23 | % possibly with different components (e.g. rgb color image)
|
---|
24 | %
|
---|
25 |
|
---|
26 | function VarVal=pdf2stat(x,pdf_val)
|
---|
27 | if ~exist('x','var')% list the stat names
|
---|
28 | VarVal={'SampleNbre';'BinSize';'Mean';'RMS';'Skewness';'Kurtosis';...
|
---|
29 | 'Min';'FirstCentile';'FirstDecile';'Median';'LastDecile';'LastCentile';'Max'};
|
---|
30 | else
|
---|
31 | nbvar=size(pdf_val,2);
|
---|
32 | VarVal=zeros(13,nbvar);
|
---|
33 | for ivar=1:nbvar
|
---|
34 | VarVal(1,ivar)=sum(pdf_val(:,ivar));% total sample number
|
---|
35 | VarVal(7,ivar)=min(x);
|
---|
36 | VarVal(13,ivar)=max(x);
|
---|
37 | VarVal(2,ivar)=(VarVal(13,ivar)-VarVal(7,ivar))/(numel(x)-1);%bin size
|
---|
38 | pdf_val(:,ivar)=pdf_val(:,ivar)/VarVal(1,ivar);% normalised pdf
|
---|
39 | VarVal(3,ivar)=sum(x.*pdf_val(:,ivar));%Mean
|
---|
40 | x=x-VarVal(3,ivar); %centered variable
|
---|
41 | Variance=sum(x.*x.*pdf_val(:,ivar));
|
---|
42 | VarVal(4,ivar)=sqrt(Variance);
|
---|
43 | VarVal(5,ivar)=(sum(x.*x.*x.*pdf_val(:,ivar)))/(Variance*VarVal(4,ivar));%skewness
|
---|
44 | VarVal(6,ivar)=(sum(x.*x.*x.*x.*pdf_val(:,ivar)))/(Variance*Variance);%kurtosis
|
---|
45 | cumpdf=cumsum(pdf_val(:,ivar));% sum of pdf
|
---|
46 | ind_centile=find(cumpdf>=0.01,1);% first index with cumsum >=0.01
|
---|
47 | VarVal(8,ivar)=x(ind_centile)+VarVal(2,ivar)/2;%
|
---|
48 | if ind_centile>1
|
---|
49 | VarVal(8,ivar)=(cumpdf(ind_centile)-0.01)*x(ind_centile-1)+(0.01-cumpdf(ind_centile-1))*x(ind_centile);
|
---|
50 | VarVal(8,ivar)=VarVal(8,ivar)/(cumpdf(ind_centile)-cumpdf(ind_centile-1))+VarVal(2,ivar)/2;%linear interpolation near ind_centile
|
---|
51 | end
|
---|
52 | ind_decile=find(cumpdf>=0.1,1);
|
---|
53 | if ind_decile>1
|
---|
54 | VarVal(9,ivar)=x(ind_decile)+VarVal(2,ivar)/2;%
|
---|
55 | VarVal(9,ivar)=(cumpdf(ind_decile)-0.1)*x(ind_decile-1)+(0.1-cumpdf(ind_decile-1))*x(ind_decile);
|
---|
56 | VarVal(9,ivar)=VarVal(9,ivar)/(cumpdf(ind_decile)-cumpdf(ind_decile-1))+VarVal(2,ivar)/2;%linear interpolation near ind_decile;
|
---|
57 | end
|
---|
58 | ind_median=find(cumpdf>= 0.5,1);
|
---|
59 | if ind_median<=1 % not enough data
|
---|
60 | return
|
---|
61 | end
|
---|
62 | VarVal(10,ivar)=(cumpdf(ind_median)-0.5)*x(ind_median-1)+(0.5-cumpdf(ind_median-1))*x(ind_median);
|
---|
63 | VarVal(10,ivar)=VarVal(10,ivar)/(cumpdf(ind_median)-cumpdf(ind_median-1))+VarVal(2,ivar)/2;%linear interpolation near ind_median;
|
---|
64 | % VarVal(9)=x(ind_median);
|
---|
65 | ind_decile=find(cumpdf>=0.9,1);
|
---|
66 | VarVal(11,ivar)=(cumpdf(ind_decile)-0.9)*x(ind_decile-1)+(0.9-cumpdf(ind_decile-1))*x(ind_decile);
|
---|
67 | VarVal(11,ivar)=VarVal(11,ivar)/(cumpdf(ind_decile)-cumpdf(ind_decile-1))+VarVal(2,ivar)/2;%linear interpolation near ind_median;
|
---|
68 | ind_centile=find(cumpdf>=0.99,1);
|
---|
69 | VarVal(12,ivar)=(cumpdf(ind_centile)-0.99)*x(ind_centile-1)+(0.99-cumpdf(ind_centile-1))*x(ind_centile);
|
---|
70 | VarVal(12,ivar)=VarVal(12,ivar)/(cumpdf(ind_centile)-cumpdf(ind_centile-1))+VarVal(2,ivar)/2;%linear interpolation near ind_centile;
|
---|
71 | end
|
---|
72 | end
|
---|