From 428ce439cb0267173cae80fe6a33ea46ffe42f87 Mon Sep 17 00:00:00 2001
From: marwan <>
Date: Tue, 1 Jul 2008 13:09:27 +0000
Subject: [PATCH] initial import

---
 twinsurr.m | 157 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 157 insertions(+)
 create mode 100644 twinsurr.m

diff --git a/twinsurr.m b/twinsurr.m
new file mode 100644
index 0000000..7b52ca5
--- /dev/null
+++ b/twinsurr.m
@@ -0,0 +1,157 @@
+function y = twinsurr(varargin)
+% TWINSURR   Creates twin surrogates for statistical tests.
+%    Y=TWINSURR(X) creates twin surrogates Y based on the vector X
+%    using recurrences. The matrix Y contains 100 columns of
+%    100 twin surrogates. If X is a PxQ matrix, the resulting
+%    surrogate matrix is Px100xQ.
+%
+%    Y=TWINSURR(X,M,T,E,...) creates twin surrogates using
+%    embedding dimension M, delay T, recurrence threshold E. The
+%    input arguments are similar to those of the command CRP.
+%
+%    Y=TWINSURR(X,M,T,E,...,N) creates N surrogates (default is 100).
+%
+%    Example: x = rand(3,1);
+%             a = [.8 .3 -.25 .9]';
+%             for i = 4:1000,
+%                x(i) = sum(a(1:3) .* x(i-1:-1:i-3)) + a(end) * randn;
+%             end
+%             xs = twinsurr(x,1,1,.1,'euc',10);
+%
+%    See also CRP, RECONS.
+%
+%    References: 
+%    Thiel, M., Romano, M. C., Kurths, J., Rolfs, M., Kliegl, R.: 
+%    Twin Surrogates to Test for Complex Synchronisation, 
+%    Europhys. Lett., 75, 2006.
+
+% Copyright (c) 2008 by AMRON
+% Norbert Marwan, Potsdam University, Germany
+% http://www.agnld.uni-potsdam.de
+%
+% $Date$
+% $Revision$
+%
+% $Log$
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% programme properties
+
+global errcode props
+
+init_properties
+nsur_init = 100;
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% check the input
+
+error(nargchk(1,7,nargin));
+if nargout>1, error('Too many output arguments'), end
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% read the input
+
+% transform any int to double
+intclasses = {'uint8';'uint16';'uint32';'uint64';'int8';'int16';'int32';'int64'};
+flagClass = [];
+for i = 1:length(intclasses)
+    i_int=find(cellfun('isclass',varargin,intclasses{i}));
+    if ~isempty(i_int)
+        for j = 1:length(i_int)
+            varargin{i_int(j)} = double(varargin{i_int(j)});
+        end
+        flagClass = [flagClass; i_int(:)];
+    end
+end
+if ~isempty(flagClass)
+    disp(['Warning: Input arguments at position [',num2str(flagClass'),'] contain integer values']);
+    disp(['(now converted to double).'])
+end
+
+
+varargin{8}=[];
+i_double=find(cellfun('isclass',varargin,'double'));
+i_char=find(cellfun('isclass',varargin,'char'));
+check_meth={'ma','eu','mi','nr','rr','fa','in','om','op','di'}; 	% maxnorm, euclidean, nrmnorm,  fan, distance
+check_norm={'non','nor'};                        % nonormalize, normalize
+
+if isnumeric(varargin{1}) 		% read commandline input
+   % check the text input parameters for method, gui 
+    temp_meth=0;
+    temp_norm=0;
+    if ~isempty(i_char)
+         for i=1:length(i_char), 
+            varargin{i_char(i)}(4)='0';
+            temp_norm=temp_norm+strcmpi(varargin{i_char(i)}(1:3),check_norm'); 
+            temp_meth=temp_meth+strcmpi(varargin{i_char(i)}(1:2),check_meth'); 
+         end
+         method_n=min(find(temp_meth));
+         nonorm=min(find(temp_norm))-1;
+         for i=1:length(i_char); temp2(i,:)=varargin{i_char(i)}(1:3); end
+
+         if isempty(nonorm), nonorm=1; end
+         if nonorm>1, nonorm=1; end
+         if isempty(method_n), method_n=1; end
+         if method_n>length(check_meth), method0=length(check_meth); end
+         method=check_meth{method_n};
+         norm_str = check_norm{nonorm+1};
+    else
+         method = 'max'; norm_str = 'non';
+    end
+
+    % get the parameters for creating RP
+    if max(size(varargin{1}))<=3
+        disp('Error using ==> twinsurr')
+        disp('To less values in data X.')
+        return
+    end
+    x=double(varargin{1});
+
+    if ~isempty(varargin{i_double(2)}), m=varargin{i_double(2)}(1); else m=1; end
+    if ~isempty(varargin{i_double(3)}), t=varargin{i_double(3)}(1); else t=1; end
+    if ~isempty(varargin{i_double(4)}), e=varargin{i_double(4)}(1); else e=.1; end
+    if ~isempty(varargin{i_double(5)}), nsur=varargin{i_double(5)}(1); else nsur=nsur_init; end
+else
+    disp('Error using ==> twinsurr')
+    disp('No valid arguments.')
+    return
+end
+
+
+N = length(x); 
+if size(x,1) < size(x,2), x = x'; end
+m = size(x,2);
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% make surrogates
+
+X = crp(x,m,t,e,method,norm_str,'sil');
+NX = length(X);
+
+%% find twins
+h = waitbar(0,'Searching Twins');
+for i = 1:NX, waitbar(i/NX)
+    A = repmat(X(:,i),1,NX);
+    S{i} = find(all(X == A));
+end
+delete(h)
+
+for k = 1:nsur
+    %% chose randomly first point
+    i = ceil(NX * rand);
+    xs = x(i,:);
+
+    %% jump randomly between twins until length of surrogate is reached
+    while length(xs) < N
+        j = S{i};
+        j_i = ceil(length(j) * rand);
+        i = j(j_i);
+        i = i + 1;
+        if i > NX
+            i = ceil(NX * rand);
+            continue 
+        end
+        xs = [xs; x(i,:)];
+    end
+    y(:,k,1:m) = reshape(xs(:),N,1,m);
+end
+
-- 
GitLab