gerard@1
|
1 % Copyright 2013 MUSIC TECHNOLOGY GROUP, UNIVERSITAT POMPEU FABRA
|
gerard@1
|
2 %
|
gerard@1
|
3 % Written by Gerard Roma <gerard.roma@upf.edu>
|
gerard@1
|
4 %
|
gerard@1
|
5 % This program is free software: you can redistribute it and/or modify
|
gerard@1
|
6 % it under the terms of the GNU Affero General Public License as published by
|
gerard@1
|
7 % the Free Software Foundation, either version 3 of the License, or
|
gerard@1
|
8 % (at your option) any later version.
|
gerard@1
|
9 %
|
gerard@1
|
10 % This program is distributed in the hope that it will be useful,
|
gerard@1
|
11 % but WITHOUT ANY WARRANTY; without even the implied warranty of
|
gerard@1
|
12 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
gerard@1
|
13 % GNU Affero General Public License for more details.
|
gerard@1
|
14 %
|
gerard@1
|
15 % You should have received a copy of the GNU Affero General Public License
|
gerard@1
|
16 % along with this program. If not, see <http://www.gnu.org/licenses/>.
|
gerard@1
|
17
|
gerard@1
|
18 function [ftr] = RQA(D, lmin,vmin)
|
gerard@1
|
19 N = max(size(D));
|
gerard@1
|
20 pts = sum(D(:));
|
gerard@1
|
21
|
gerard@1
|
22 det = 0;
|
gerard@1
|
23 diags=[];
|
gerard@1
|
24 for i = 1:N-1
|
gerard@1
|
25 line = [0;diag(D,i);0];
|
gerard@1
|
26 starts=find(diff(line)==1); % line starts
|
gerard@1
|
27 ends=find(diff(line)==-1); % line ends
|
gerard@1
|
28 diags = [diags; ends-starts];
|
gerard@1
|
29 end
|
gerard@1
|
30
|
gerard@1
|
31 verts = [];
|
gerard@1
|
32 intervals = [];
|
gerard@1
|
33 for i = 1:N
|
gerard@1
|
34 line = [0;D(:,i);0];
|
gerard@1
|
35 starts=find(diff(line)==1); % line starts
|
gerard@1
|
36 ends=find(diff(line)==-1); % line ends
|
gerard@1
|
37 verts = [verts;ends-starts];
|
gerard@1
|
38 end
|
gerard@1
|
39
|
gerard@1
|
40 rr = pts/N^2; % recurrence rate
|
gerard@1
|
41 det = sum(diags(diags>=lmin))/pts; % determinism
|
gerard@1
|
42 adll = mean(diags(diags>=lmin)); % average diagonal line length
|
gerard@1
|
43 sddll = std(diags(diags>=lmin)); % standard deviation
|
gerard@1
|
44
|
gerard@1
|
45 dratio = N^2 * sum(diags(diags>=lmin))/(pts^2);
|
gerard@1
|
46
|
gerard@1
|
47 lam = sum(verts(verts>=vmin))/pts; % laminarity
|
gerard@1
|
48 tt = mean(verts(verts>=vmin)); % trappnig time
|
gerard@1
|
49 sdvll = std(verts(verts>=lmin)); % standard deviation
|
gerard@1
|
50 if(isnan(tt))
|
gerard@1
|
51 tt = 0;
|
gerard@1
|
52 end
|
gerard@1
|
53
|
gerard@1
|
54 vratio = N^2 * sum(verts(verts>=vmin))/(pts^2); % ratio
|
gerard@1
|
55
|
gerard@1
|
56 lmax = max(1,max(diags)); % maximum diagonal line length
|
gerard@1
|
57 vmax = max(1,max(verts)); % maximum vertical line length
|
gerard@1
|
58
|
gerard@1
|
59 if(isempty(lmax))
|
gerard@1
|
60 lmax = 1;
|
gerard@1
|
61 end
|
gerard@1
|
62
|
gerard@1
|
63
|
gerard@1
|
64 if(isempty(vmax))
|
gerard@1
|
65 vmax = 1;
|
gerard@1
|
66 end
|
gerard@1
|
67
|
gerard@1
|
68 ddiv = 1/lmax; % divergence
|
gerard@1
|
69 vdiv = 1/vmax;
|
gerard@1
|
70
|
gerard@1
|
71 diagsH = hist(diags,max(diags));
|
gerard@1
|
72 diagsH = diagsH/sum(diagsH);
|
gerard@1
|
73 z = find(diagsH==0);
|
gerard@1
|
74 temp = diagsH.*log(diagsH);
|
gerard@1
|
75 temp(z)=0; % remove NaNs from zero prob
|
gerard@1
|
76 dentropy = sum(temp); % shannon entropy (diagonal)
|
gerard@1
|
77
|
gerard@1
|
78
|
gerard@1
|
79 vertsH = hist(verts,max(verts));
|
gerard@1
|
80 vertsH = vertsH/sum(vertsH);
|
gerard@1
|
81 z = find(vertsH==0);
|
gerard@1
|
82 temp = vertsH.*log(vertsH);
|
gerard@1
|
83 temp(z)=0; % remove NaNs from zero prob
|
gerard@1
|
84 ventropy = sum(temp); % shannon entropy (vertical)
|
gerard@1
|
85
|
gerard@1
|
86 ftr = [rr,det,adll,lam,tt,dratio,ddiv,dentropy,vratio,ventropy,vdiv];
|
gerard@1
|
87 end
|