function xout=crp2(varargin) %CRP2 Creates a cross recurrence plot/ recurrence plot and the LOS. % CRP(X [,Y [,param1,param2,...]) creates a cross recurrence % plot/ recurrence plot from the embedding vectors X and Y. % Results can be stored into the workspace. Further it % is possible to estimate the line of synchronization (LOS) % in order to get the nonparametric time-relationship between % the two considered systems. % % R=CRP(X,M2,T,E) uses the additionally dimension M2, delay T % and the size of neighbourhood E and creates a recurrence % plot of X. % % R=CRP(X,Y,'distance','nonormalize') creates a % distance coded matrix plot without normalization % of the data. % % Allows to change the parameters interactively by % using a GUI. % % The embedding dimension M is given by the size of the % N x M matrix X and Y; if the matrix Y is not specified, % a simple recurrence plot is created. % % Parameters: additionally dimension M2, delay T and the % size of neighbourhood E are the first three numbers % after the data series; further parameters can be used % to switch between various methods of finding the % neighbours of the phasespace trajectory, to suppress % the normalization of the data and to suppress the % GUI (useful in order to use this programme by other % programmes). % % Methods of finding the neighbours. % maxnorm - Maximum norm. % euclidean - Euclidean norm. % minnorm - Minimum norm. % nrmnorm - Euclidean norm between normalized vectors % (all vectors have the length one). % fan - Fixed amount of nearest neighbours. % omatrix - Order matrix (disabled). % opattern - Order patterns recurrence plot. % distance - Distance coded matrix (global CRP, Euclidean norm). % % Normalization of the data series. % normalize - Normalization of the data. % nonormalize - No normalization of the data. % % Suppressing the GUI. % gui - Creates the GUI and the output plot. % nogui - Suppresses the GUI and the output plot. % silent - Suppresses all output. % % Parameters not needed to be specified. % % Current limitation: for higher speed in % output the whole matrix of the recurrence % plot is in the work space - this limits % the application of long data series. % % Examples: a = sin((1:1000) * 2 * pi/200); % pendulum's location vector % b = cos((1:1000) * 2 * pi/200); % pendulum's velocity vector % plot(a,b,'.') % crp2(a(1:500),b(1:500),'nonorm','euclidean') % % b = sin(.01 * ([1:1000] * 2 * pi/67) . ^2); % crp2(b(1:500),a(1:700),3,10,.06,'fan') % % See also CRP, CRP_BIG, JRP and TRACKPLOT. % % References: % Marwan, N., Thiel, M., Nowaczyk, N.: % Cross Recurrence Plot Based Synchronization of Time Series, % Nonlin. Proc. Geophys., 9, 2002. % Copyright (c) 1998-2004 by AMRON % Norbert Marwan, Potsdam University, Germany % http://www.agnld.uni-potsdam.de % % $Date$ % $Revision$ % % $Log$ % Revision 5.1 2005/04/08 09:52:27 marwan % plugin added % % Revision 4.8.1.7.2.1 2005/04/08 09:22:13 marwan % Included plugin % % Revision 4.8.1.7 2005/04/06 12:57:50 marwan % small deviation in threshold application fixed % % Revision 4.8.1.6 2005/03/16 12:21:54 marwan % add hint in help text for joint recurrence plots % % Revision 4.8.1.5 2005/03/16 11:19:02 marwan % help text modified % % Revision 4.8.1.4 2004/12/23 07:49:03 marwan % bug in order patterns RP fixed (empty order patterns) % % Revision 4.8.1.3 2004/12/02 13:18:30 marwan % bug due to missing variable % % Revision 4.8.1.2 2004/11/15 12:52:34 marwan % bug fix in choice of neighbourhood (enabling and disabling parameters) % % Revision 4.8.1.1 2004/11/12 08:39:02 marwan % bug fix in order patterns representation % % Revision 4.8 2004/11/11 12:18:12 marwan % order patterns recurrence plot added % % Revision 4.7 2004/11/10 07:04:40 marwan % initial import % % % This program is part of the new generation XXII series. % % This program is free software; you can redistribute it and/or % modify it under the terms of the GNU General Public License % as published by the Free Software Foundation; either version 2 % of the License, or any later version. warning off global errcode props %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% programme properties errcode=0; init_properties hCRP=[];hCtrl=[];nogui=[];obj=[];mflag=[]; set(0,'ShowHidden','On') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% check and read the input error(nargchk(1,9,nargin)); if nargout>1, error('Too many output arguments'), end check_meth={'ma','eu','mi','nr','fa','in','om','op','di'}; % maxnorm, euclidean, nrmnorm, fan, distance check_norm={'non','nor'}; % nonormalize, normalize check_gui={'gui','nog','sil'}; % gui, nogui, silent if isnumeric(varargin{1}) % read commandline input varargin{9}=[]; i_double=find(cellfun('isclass',varargin,'double')); i_char=find(cellfun('isclass',varargin,'char')); % check the text input parameters for method, gui and normalization temp_meth=0; temp_norm=0; temp_gui=0; if ~isempty(i_char) for i=1:length(i_char), varargin{i_char(i)}(4)='0'; temp_meth=temp_meth+strcmpi(varargin{i_char(i)}(1:2),check_meth'); temp_norm=temp_norm+strcmpi(varargin{i_char(i)}(1:3),check_norm'); temp_gui=temp_gui+strcmpi(varargin{i_char(i)}(1:3),check_gui'); end method=min(find(temp_meth)); nonorm=min(find(temp_norm))-1; nogui=min(find(temp_gui))-1; if isempty(method), method=1; end if isempty(nonorm), nonorm=1; end if isempty(nogui), nogui=0; end if method>length(check_meth), method=length(check_meth); end if nonorm>1, nonorm=1; end if nogui>2, nogui=2; end else method=1; nonorm=1; nogui=0; end if nogui==0 & nargout>0, nogui=1; end % get the parameters for creating RP if max(size(varargin{1}))<=3 error('To less values in data X.') end x=double(varargin{1}); if isempty(varargin{2}) | ~isnumeric(varargin{2}), y=x; else y=double(varargin{2}); end if (isnumeric(varargin{2}) & max(size(varargin{2}))==1) | ~isnumeric(varargin{2}) y=x; if ~isempty(varargin{i_double(2)}), m0=varargin{i_double(2)}(1); else m0=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 else if ~isempty(varargin{i_double(3)}), m0=varargin{i_double(3)}(1); else m0=1; end if ~isempty(varargin{i_double(4)}), t=varargin{i_double(4)}(1); else t=1; end if ~isempty(varargin{i_double(5)}), e=varargin{i_double(5)}(1); else e=.1; end end t=round(t); m0=round(m0); mflag=method; if e<0, e=1; disp('Warning: The threshold size E cannot be negative and is now set to 1.'), end if t<1, t=1; disp('Warning: The delay T cannot be smaller than one and is now set to 1.'), end action='init'; if size(x,1)==1, x=x'; end, if size(y,1)==1, y=y'; end m=max([size(x,2) size(y,2)]); if ~isempty(find(isnan(x))) disp('NaN detected (in first variable) - will be cleared.') for k=1:size(x,2), x(find(isnan(x(:,k))),:)=[]; end end if ~isempty(find(isnan(y))) disp('NaN detected (in second variable) - will be cleared.') for k=1:size(y,2), y(find(isnan(y(:,k))),:)=[]; end end if size(x,1) < t*(m-1)+1 | size(y,1) < t*(m-1)+1 error(['Too less data',10,... 'Either too much NaN or the number of columns in the vectors do not match.']) end Nx=size(x,1); Ny=size(y,1); NX=Nx-t*(m-1);NY=Ny-t*(m-1); x0=zeros(Nx,m);y0=zeros(Ny,m); x0(1:size(x,1),1:size(x,2))=x; y0(1:size(y,1),1:size(y,2))=y; if nonorm==1, x=(x0-repmat(mean(x0),Nx,1))./repmat(std(x0),Nx,1); y=(y0-repmat(mean(y0),Ny,1))./repmat(std(y0),Ny,1); end if ~isempty(find(isnan(x))), for k=1:size(x,2), x(find(isnan(x(:,k))),:)=[]; end, end if ~isempty(find(isnan(y))), for k=1:size(y,2), y(find(isnan(y(:,k))),:)=[]; end, end if size(x,1) < t*(m-1)+1 | size(y,1) < t*(m-1)+1 error(['Too less data',10,... 'Either too much NaN or the number of columns in the vectors do not match.']) end if method==7 & m > 1, m=1; disp('Warning: For order matrix a dimension of one is used.') end ds=eye(m); else % read input from the GUI action=varargin{1}; nogui=0; h=get(gcf,'Name');h=h(findstr(h,'(')+1:findstr(h,')')-1); hCRP=findobj('Name',['Cross Recurrence Plot (' h ')']); hCtrl=findobj('Name',['Control (' h ')']); h=str2num(h); xshuttle=get(findobj('Parent',hCRP,'Tag','DataPlot2'),'UserData'); if ~isempty(xshuttle) x=xshuttle(:,2:end); yshuttle=get(findobj('Parent',hCRP,'Tag','DataPlot1'),'UserData'); y=yshuttle(:,2:end); if ~isempty(hCtrl) if get(findobj('Tag','Unthresh','Parent',hCtrl),'Value') mflag=length(check_meth); else mflag=get(findobj('Tag','Method','Parent',hCtrl),'Value'); end m=size(x,2); m0=get(findobj('Tag','Dim0','Parent',hCtrl),'Value'); t=str2num(get(findobj('Tag','Delay','Parent',hCtrl),'String')); e=str2num(get(findobj('Tag','Size','Parent',hCtrl),'String')); if e<0, e=1; errordlg('The threshold size E cannot be negative.','Threshold size to small') waitforbuttonpress set(findobj('Tag','Size','Parent',hCtrl),'String','1') action=''; end if t<1, t=1; errordlg('The delay T cannot be smaller than one.','Delay to small') waitforbuttonpress set(findobj('Tag','Delay','Parent',hCtrl),'String','1') action=''; end ds = get(findobj('Tag','DimEx','Parent',hCtrl),'UserData'); if mflag==7 | mflag==8 | mflag==length(check_meth) set(findobj('Tag','Size','Parent',hCtrl),'enable','off'); set(findobj('Tag','Sizetext','Parent',hCtrl),'enable','off'); else set(findobj('Tag','Size','Parent',hCtrl),'enable','on'); set(findobj('Tag','Sizetext','Parent',hCtrl),'enable','on'); end if mflag==7 & m > 1, m=1; ds = 1; disp('Warning: For order matrix a dimension of one is used.') end Nx=length(x); Ny=length(y); NX=Nx-t*(m-1);NY=Ny-t*(m-1); xscale=1:Nx; yscale=1:Ny; if (NX<1 | NY<1) & strcmpi(action,'apply'); errordlg('The embedding vectors cannot be created. Dimension M and/ or delay T are to big. Please use smaller values.','Dimension/ delay to big') waitforbuttonpress action=''; end end end temp=get(findobj('Tag','fixp','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'XData'); if ~isempty(temp) for i=1:length(temp), if iscell(temp), fixp(i,1)=temp{i}; else, fixp(i,1)=temp(i); end, end temp=get(findobj('Tag','fixp','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'YData'); for i=1:length(temp), if iscell(temp), fixp(i,2)=temp{i}; else, fixp(i,2)=temp(i); end, end else fixp=[]; end clear xshuttle yshuttle temp cm_old=get(hCRP,'Colormap'); cm=[{hsv(256)}; {hot(256)}; {gray(256)};... {french(256)}; {bone(256)}; {copper(256)}; {pink(256)};... {flag(256)}; {lines(256)}; {colorcube(256)};... {jet(256)}; {prism(256)}; {cool(256)};... {autumn(256)}; {spring(256)}; {winter(256)};... {summer(256)}; {flipud(gray(2))}; {flipud(cm_old)}]; if isempty(findobj('Tag','CRPFig')) & nogui==0 action='init'; end end h_meth = findobj('Tag','Method','Parent',hCtrl); if mflag==6, mflag=2; warndlg(['The neighbourhood criterion ''Interdependent''',10,'is not implemented - use crp or crp_big instead.'],'Neighbourhood'); waitforbuttonpress if ~isempty(h_meth) set(h_meth,'value',mflag) end return end if mflag==7, mflag=2; warndlg(['The neighbourhood criterion ''Oder matrix''',10,'is not implemented - use crp or crp_big instead.'],'Neighbourhood'); waitforbuttonpress if ~isempty(h_meth) set(h_meth,'value',mflag) end set(findobj('Tag','Size','Parent',hCtrl),'enable','on'); set(findobj('Tag','Sizetext','Parent',hCtrl),'enable','on'); return end method=mflag; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% splash the GPL splash_gpl('crp') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% nogui if nogui>0 hCRP=9999; if nogui~=2 tx(1)={'Maximum norm'}; tx(2)={'Euclidean norm'}; tx(3)={'Minimum norm'}; tx(4)={'Euclidean norm of normalized distance'}; tx(5)={'fixed amount of nearest neighbours'}; tx(6)={'interdependent neighbours'}; tx(7)={'order matrix'}; tx(8)={'order pattern'}; tx(9)={'distance plot'}; disp(['use method: ', char(tx(method))]); if nonorm==1, disp('normalize data'); else disp('do not normalize data'); end end action='compute'; if (NX<1 | NY<1) disp('Warning: The embedding vectors cannot be created.') disp('Dimension M and/ or delay T are to big. Please use smaller values.') action=''; end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% switch routines try switch(action) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% initialization case 'init' errcode=1; xshuttle(:,1)=(1:length(x))'; xshuttle(:,2:size(x,2)+1)=x; yshuttle(:,1)=(1:length(y))'; yshuttle(:,2:size(y,2)+1)=y; ds=eye(m); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% create GUI errcode=2; scr=get(0,'ScreenSize'); root_ud=get(0,'UserData'); if isstruct(root_ud) if isfield(root_ud,'crp') if ~isempty(root_ud.crp) root_ud.crp=[root_ud.crp max(root_ud.crp)+1]; else root_ud.crp=1; end h=num2str(root_ud.crp(end)); else root_ud.crp=1; h=num2str(1); end else root_ud.old=root_ud; root_ud.crp=1; h=num2str(1); end set(0,'UserData',root_ud) %%%%%%%%%%%%%%%%% CRP Figure [h_axes,h_fig]=create_CRPfig(h,xshuttle,yshuttle); h0=uicontextmenu('Parent',h_fig); set(h_axes,'UIContextMenu',h0) h2=line([],[],[],'Parent',h_axes,'visible','off','Tag','Diagonal','color',[1 0 0],... 'LineWidth',1); uimenu(h0, 'Label', 'Set Point', 'Callback', 'crp2 LOSset') %%%%%%%%%%%%%%%%% Control Figure errcode=3; h9=figure('Tag','CRPFig',... % Control Figure 'Color',[0.8 0.8 0.8], ... 'Position',[5*scr(3)/8+10 scr(4)/8 1*scr(3)/6 3*scr(4)/4 ],... 'NumberTitle','off',... 'Name',['Control (' h ')'],... 'MenuBar','None',... 'DeleteFcn','crp2 handlevisON',... 'Resize','Off'); set(h9,props.window,'Units','Norm') h0=uicontrol(props.frame, ... % Frame Embedding 'Units','Normalized',... 'Position',[.1 .647 .8 .323]); h0=uicontrol(props.text,... % Text Embedding 'Units','Normalized', ... 'FontAngle','italic', ... 'Position',[.12 .939 .6 .02], ... 'String','Embedding'); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h1(3) h1(4)]) h0=uicontrol(props.text,... % Text Dimension 'Units','Normalized',... 'String','Dimension:',... 'Position',[.16 .905 .35 .02]); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h1(3) h1(4)]) if method==7, set(h0,'Enable','Off'); end h0=uicontrol(props.text,... % Text Dimensionvalue 'Units','Normalized',... 'Tag','Dim',... 'String',['x ',num2str(m)],... 'Position',[.71 .905 .14 .02], ... 'ToolTip','Embedding dimension.'); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h1(3) h1(4)]) if method==7, set(h0,'Enable','Off'); end h0=uicontrol(props.popup,... % Input Dimensionfactor 'Units','Normalized',... 'Tag','Dim0',... 'String','1|2|3|4',... 'Position',[.54 .91 .18 .026], ... 'Value',m0,... 'Callback','crp2 dimfit',... 'ToolTip','Select the embedding dimensionfactor.'); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h2(3) h1(4)]) if method==7, set(h0,'Enable','Off'); end h0=uicontrol(props.text,... % Text Delay 'Units','Normalized',... 'String','Delay:',... 'Position',[.16 .862 .35 .02]); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h2(3) h1(4)]) if method==7, set(h0,'Enable','Off'); end h0=uicontrol(props.edit,... % Input Delay 'Units','Normalized',... 'Tag','Delay',... 'String',t,... 'Position',[.54 .866 .279 .026],... 'ToolTip','Insert the embedding delay time.'); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h2(3) h1(4)]) if m0==1; set(h0,'Enable','off') end if method==7, set(h0,'Enable','Off'); end h0=uicontrol(props.text,... % Text Vector Excluding 'Units','Normalized',... 'String','Vector Excluding:',... 'Position',[.16 .826 .6 .02], ... 'Tag','DimEx',... 'UserData', ds); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h1(3) h1(4)]) for i=1:3, for j=1:4 % Input Vector Excluding h0 = uicontrol(props.button,'Units','normalized', ... 'Callback','crp2 exclude', ... 'Position',[.18+(j-1)*0.167 0.798-(i-1)*0.034 .14 0.028], ... 'String',(i-1)*4+j, ... 'ToolTip','Exclude this vector.',... 'Tag',['DimShift' num2str((i-1)*4+j)]); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h2(3) h1(4)]) end, end for i=1:12 if i>m, set(findobj('Tag',['DimShift' num2str(i)]), 'Enable', 'off'); else, set(findobj('Tag',['DimShift' num2str(i)]), 'Enable', 'on'); end end h0=uicontrol(props.text,... % Text Copyright 'Units','Normalized',... 'HorizontalAlignment','center',... 'Position',[.15 .65 .7 .06]); h1=textwrap(h0,{'� AGNLD','University of Potsdam','1998-2004'}); set(h0,'String',h1) h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h2(3) h1(4)]) h0=uicontrol(props.frame, ... % Frame Neighbourhood 'Units','Normalized',... 'Position',[.1 .449 .8 .18]); h0=uicontrol(props.text,... % Text Neighbourhood 'Units','Normalized',... 'FontAngle','italic', ... 'String','Neighbourhood',... 'Position',[.12 .598 .6 .02]); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h1(3) h1(4)]) h0=uicontrol(props.checkbox, ... % Button Unthresholded 'Units','Normalized',... 'Position',[.16 .555 .51 .032], ... 'String','Unthresholded', ... 'CallBack','crp2 unthresh',... 'Tag','Unthresh',... 'ToolTip','Switch between thresholded and unthresholded CRP.' ); if method==9, set(h0,'Value',1); end if method==7 | method==8, set(h0,'Enable','Off'); end h1=uicontrol(props.popup, ... % Button Unthresholded Scale 'Units','Normalized',... 'Position',[.69 .555 .14 .032], ... 'String','1|1/2|1/4|1/6|1/8', ... 'Value',1,... 'CallBack','crp2 log',... 'Enable','off',... 'Tag','Log',... 'ToolTip','Switch between various scaled CRP.' ); if method==9, set(h1,'Enable','On'); end h2=uicontrol(props.popup,... % Input Neighbourhood Method 'Units','Normalized',... 'String','Maximum Norm|Euclidean Norm|Minimum Norm|Normalized Norm|Fixed Amount|Interdependent|Order Matrix|Order Pattern',... 'Position',[.16 .509 .67 .032],... 'CallBack','crp2 unthresh',... 'Tag','Method',... 'ToolTip','Select the method of finding neighbours.'); if method==9, set(h2,'Enable','Off'); else, set(h2,'Value',method); end h0=uicontrol(props.text,... % Text Threshold 'Units','Normalized',... 'Tag','Sizetext',... 'String','Threshold:',... 'Position',[.16 .462 .35 .02]); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h2(3) h1(4)]) if method==9 | method==8, set(h0,'Enable','Off'); end h0=uicontrol(props.edit,... % Input Threshold 'Units','Normalized',... 'Tag','Size',... 'Position',[.58 .466 .249 .026],... 'HorizontalAlignment', 'right',... 'String',e,... 'ToolTip','Insert the size of neighbourhood.' ); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h2(3) h1(4)]) if method==9 | method==8, set(h0,'Enable','Off'); end dark_factor=.86; h0=uicontrol(props.frame,'BackgroundColor',dark_factor*props.frame.BackgroundColor, ... % Frame LOSsearch 'Units','Normalized',... 'Position',[.1 .212 .8 .22]); h0=uicontrol(props.text,... % Text LOSsearch 'Units','Normalized',... 'FontAngle','italic', ... 'String','LOS Search',... 'Tag','TextLOSsearch',... 'BackgroundColor',dark_factor*props.frame.BackgroundColor,... 'Enable','off',... 'Position',[.12 .40 .6 .02]); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h1(3) h1(4)]) h0=uicontrol(props.button,... % Set Point 'Units','Normalized',... 'Tag','SetPoint',... 'String','Set Point',... 'Position',[.16 .36 .314 .032],... 'Enable','off',... 'BackgroundColor',dark_factor*props.frame.BackgroundColor,... 'ToolTip','Set a Point on LOS.',... 'CallBack','crp2 LOSset'); h0=uicontrol(props.button,... % Clear Point 'Units','Normalized',... 'Tag','ClearPoint',... 'String','Clear P',... 'Position',[.52 .36 .314 .032],... 'Enable','off',... 'ToolTip','Clear a Point on LOS.',... 'BackgroundColor',dark_factor*props.frame.BackgroundColor,... 'CallBack','crp2 LOSclear'); h0=uicontrol(props.button,... % Clear All Point 'Units','Normalized',... 'Tag','ClearAllPoint',... 'String','Clear All',... 'Position',[.52 .32 .314 .032],... 'Enable','off',... 'ToolTip','Clear All Points on LOS.',... 'BackgroundColor',dark_factor*props.frame.BackgroundColor,... 'CallBack','crp2 LOSallclear'); h0=uicontrol(props.text,... % Text LOSwidthX 'Units','Normalized',... 'Tag','LOSwidthXtext',... 'String','dx:',... 'BackgroundColor',dark_factor*props.frame.BackgroundColor,... 'Position',[.16 .274 .35 .02],... 'Enable','off'); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h1(3) h1(4)]) h0=uicontrol(props.edit,... % Input LOSwidthX 'Units','Normalized',... 'Tag','LOSwidthX',... 'Position',[.315 .278 .15 .026],... 'String','1',... 'Enable','off',... 'ToolTip','Insert the LOS width in X-direction.' ); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h2(3) h1(4)]) h0=uicontrol(props.text,... % Text LOSwidthY 'Units','Normalized',... 'Tag','LOSwidthYtext',... 'String','dy:',... 'Position',[.52 .274 .35 .02],... 'Enable','off',... 'BackgroundColor',dark_factor*props.frame.BackgroundColor); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h1(3) h1(4)]) h0=uicontrol(props.edit,... % Input LOSwidthY 'Units','Normalized',... 'Tag','LOSwidthY',... 'Position',[.679 .278 .15 .026],... 'String','1',... 'Enable','off',... 'ToolTip','Insert the LOS width in Y-direction.' ); h1=get(h0,'Extent'); h2=get(h0,'Position'); set(h0,'Position',[h2(1) h2(2) h2(3) h1(4)]) h0=uicontrol(props.button,... % Button ApplyLOSsearch 'Units','Normalized',... 'String','Apply',... 'Position',[.16 .23 .314 .032],... 'Tag','Apply2',... 'Callback','crp2 LOSsearch',... 'BackgroundColor',dark_factor*props.frame.BackgroundColor,... 'Enable','off',... 'ToolTip','Searches the LOS.'); h0=uicontrol(props.button,... % Button Stores LOS 'Units','Normalized',... 'String','Store',... 'Position',[.52 .23 .314 .032],... 'Tag','Store2',... 'Callback','crp2 store2',... 'BackgroundColor',dark_factor*props.frame.BackgroundColor,... 'Enable','off',... 'ToolTip','Stores the LOS.'); if ~isunix h0=uicontrol(props.frame, ... % Frame Embedding 'Units','Normalized',... 'Position',[.1 .15 .38 .045]); end h0=uicontrol(props.checkbox, ... % Checkbox Stretch Plot 'Units','Normalized',... 'Position',[.1 .15 .38 .045], ... 'String','Stretch', ... 'Tag','Stretch',... 'CallBack','crp2 stretch',... 'Value',1,... 'ToolTip','Streches the plotted CRP to a squared plot.' ); h0=uicontrol(props.button, ... % Button Store Matrix 'Units','Normalized',... 'Position',[.52 .15 .38 .045], ... 'String','Store Matrix', ... 'Style','pushbutton', ... 'Tag','Store',... 'CallBack','crp2 store',... 'Value',1,... 'ToolTip','Stores the CRP matrix into variable X in the workspace.' ); h0=uicontrol(props.button,... % Button Help 'Units','Normalized',... 'String','Help',... 'Position',[.1 .03 .38 .045],... 'Tag','Help',... 'Callback','helpwin crp2',... 'ToolTip','Opens the helpwindow.'); h0=uicontrol(props.button,... % Button Apply 'Units','Normalized',... 'String','Create Recurrence Plot',... 'Position',[.1 .09 .8 .045],... 'Tag','Apply',... 'Callback','crp2 compute',... 'ToolTip','Starts the computation - be patient.'); h0=uicontrol(props.button,... % Button Close 'Units','Normalized',... 'String','Close',... 'Position',[.52 .03 .38 .045],... 'Tag','Close',... 'Callback','crp2 close',... 'ToolTip','Closes CRP windows.'); set(h9, 'HandleVis','CallBack') clear h0 h1 h8 h9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% vectorexclude errcode=4; case 'exclude' ds = get(findobj('Tag','DimEx','Parent',gcf),'UserData'); j=str2num(get(gco,'String')); if ds(j,j)==1 set(gco,'ForegroundColor', [.5 0 0],... 'FontWeight','bold',... 'BackgroundColor', .8*props.button.BackgroundColor,... 'ToolTip','Include this vector.'); ds(j,j)= -1; if -(trace(ds))==length(ds) ds(j,j)= 1; set(gco,'ForegroundColor', [0 0 0],'FontWeight','normal',... 'BackgroundColor', props.button.BackgroundColor,... 'ToolTip','Exclude this vector.'); else h0=gcf; figure(hCRP) h1=findobj('Tag','Data1'); set(h1(length(h1)-j+1),'Visible','off') h2=findobj('Tag','Data2'); set(h2(length(h1)-j+1),'Visible','off') figure(h0), clear h1 h0 end else set(gco,'ForegroundColor', [0 0 0],'FontWeight','normal',... 'BackgroundColor', props.button.BackgroundColor,... 'ToolTip','Exclude this vector.'); ds(j,j)= 1; h0=gcf; figure(hCRP) h1=findobj('Tag','Data1'); set(h1(length(h1)-j+1),'Visible','on') h2=findobj('Tag','Data2'); set(h2(length(h1)-j+1),'Visible','on') figure(h0), clear h1 h0 end set(findobj('Tag','DimEx','Parent',gcf),'UserData', ds); m1=length(find(sum(ds)+1)); set(findobj('Tag','Dim','Parent',gcf),'string', ['x ',num2str(m1)]); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% delay case 'dimfit' errcode=5; m1=length(find(sum(ds)+1)); if m0~=1 set(findobj('Tag','Delay','Parent',gcf),'Enable', 'On'); else set(findobj('Tag','Delay','Parent',gcf),'Enable', 'Off'); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% unthresh case 'unthresh' errcode=6; switch_unthresholded(hCRP) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% stretch case 'stretch' errcode=7; stretch(hCRP,xscale,yscale,Nx,Ny) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% change colormap case 'log' errcode=82; change_colormapscale(hCRP,cm) case 'colormap' errcode=81; change_colormap(hCtrl,hCRP,cm) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% store case 'store' errcode=9; X=get(findobj('Tag','CRPData','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'UserData'); if isempty(X) warndlg('The CRP matrix is still empty. Please start the computation before storing.','Empty CRP') waitforbuttonpress else assignin('base','X', double(X)) end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% handlevisON case 'handlevisON' set(hCRP, 'HandleVis','on') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% close case 'close' errcode=101; close_all case 'smartclose' errcode=102; if ishandle(hCRP) & ishandle(hCtrl) smart_close(hCRP,hCtrl) end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% computation case 'compute' errcode=11; txt_cross='Cross '; if size(x)==size(y) if x==y, txt_cross=''; end end if nogui==0 setptr([hCRP,hCtrl],'watch') h=findobj('Tag','Apply','Parent',hCtrl); obj.children=get(hCtrl,'Children'); obj.enable=get(obj.children,'Enable'); set(obj.children,'Enable','off') set(h(1),'String','Stop',... 'ToolTip','Stops the computation.',... 'Enable','on',... 'Callback','set(gcbo,''String'',''Stopped'')') end h1=findobj('Parent',hCRP,'Tag','CRPPlot'); h2=findobj('Tag','Diagonal','Parent',h1); if ~nogui if isempty(h2) h2=line('Parent',h1,'visible','off','Tag','Diagonal','color',[1 0 0],... 'LineWidth',1); else set(h2,'visible','off') end set(findobj('Tag','Store2','Parent',hCtrl),'Enable','Off') set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'Visible','on') set(findobj('Tag','CRPData','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'Visible','off') end % check if plugin exist and is executable [plugin_exist, plugin_name, plugin_path] = is_crp_plugin; if plugin_exist & ( mflag < 4 | mflag == 9 ) & length(x) == length(y) % if plugin exist and method is MAX, MIN, EUC ord DIS if nogui == 1, disp('(plugin used)'), end [X matext] = crp_plugin(x, y, m, t, e, mflag, hCRP, plugin_path, 0); else % use builtin implementation if ~nogui set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Import Embedding Vectors'),drawnow end ex=ceil(find(~(ds+1))/m); x(:,ex)=[]; y(:,ex)=[]; m=m-length(ex); if m==0, set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','No embedding vectors!'),drawnow return end if m0>1 x2=x(1:end-t*(m0-1),:); y2=y(1:end-t*(m0-1),:); for i=1:m0-1, if check_stop(hCRP,hCtrl,nogui,obj), break, end x2(:,m*i+1:m*(i+1))=x(1+t*i:end-t*(m0-i-1),:); y2(:,m*i+1:m*(i+1))=y(1+t*i:end-t*(m0-i-1),:); end x=x2; y=y2; Nx=size(x,1); Ny=size(y,1); m=m0*m; clear x2 y2 end x1=repmat(x,1,Ny); if check_stop(hCRP,hCtrl,nogui,obj), return, end for mi=1:m, x2(:,mi)=reshape(rot90(x1(:,0+mi:m:Ny*m+mi-m)),Nx*Ny,1); end y1=repmat(y,Nx,1); x1=x2; clear x2 if check_stop(hCRP,hCtrl,nogui,obj), return, end switch(mflag) %%%%%%%%%%%%%%%%% local CRP, fixed distance maximum norm case {1,2,3} errcode=111; set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Compute Distance Matrix'),drawnow s=zeros(m,Nx*Ny); if check_stop(hCRP,hCtrl,nogui,obj), return, end s1=zeros(Nx*Ny,m); if check_stop(hCRP,hCtrl,nogui,obj), return, end X=uint8(zeros(Ny,Nx)); if check_stop(hCRP,hCtrl,nogui,obj), return, end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Compute Distance Matrix'),drawnow s1=x1-y1; switch mflag case 1 %%%%%%%%%%%%%%%%% maximum norm if m>1 if check_stop(hCRP,hCtrl,nogui,obj), return, end s=max(abs(s1')); else s=abs(s1); end matext=[num2str(round(100*e)/100) '\sigma (fixed distance maximum norm)']; case 2 %%%%%%%%%%%%%%%%% euclidean norm errcode=112; if m>1 if check_stop(hCRP,hCtrl,nogui,obj), return, end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Transpose Matrix'),drawnow s=s1.^2'; if check_stop(hCRP,hCtrl,nogui,obj), return, end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Sum Matrix'),drawnow s1=sum(s); if check_stop(hCRP,hCtrl,nogui,obj), return, end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Squareroot Matrix'),drawnow s=sqrt(s1); else s=abs(s1); end matext=[num2str(round(100*e)/100) '\sigma (fixed distance euclidean norm)']; case 3 %%%%%%%%%%%%%%%%% minimum norm errcode=113; if m>1 if check_stop(hCRP,hCtrl,nogui,obj), return, end s = sum(abs(s1),2); else s=abs(s1); end matext=[num2str(round(100*e)/100) '\sigma (fixed distance minimum norm)']; end if check_stop(hCRP,hCtrl,nogui,obj), return, end %%%%%%%%%%%%%%%%% now apply threshold set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')'),'String','Building CRP Matrix'),drawnow X2 = s<e; X=reshape(uint8(X2),Ny,Nx); clear s s1 x1 y1 %%%%%%%%%%%%%%%%% local CRP, normalized distance euclidean norm case 4 errcode=114; set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Normalize Embedding Vectors'),drawnow Dx=sqrt(sum(((x1(:,:)).^2)'))'; if check_stop(hCRP,hCtrl,nogui,obj), return, end Dy=sqrt(sum(((y1(:,:)).^2)'))'; if check_stop(hCRP,hCtrl,nogui,obj), return, end x1=x1./repmat(Dx,1,m); if check_stop(hCRP,hCtrl,nogui,obj), return, end y1=y1./repmat(Dy,1,m); clear Dx Dy if check_stop(hCRP,hCtrl,nogui,obj), return, end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Reshape Embedding Vectors'),drawnow set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Compute Distance Matrix'),drawnow if m>1 s=sqrt(sum(((x1(:,:)-y1(:,:)).^2)')); else s=abs(x1(:,1)-y1(:,1)); end if check_stop(hCRP,hCtrl,nogui,obj), return, end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Building CRP Matrix'),drawnow X=reshape(uint8(255*s/max(s))<(255*e/max(s)),Ny,Nx); clear s x1 y1 matext=[num2str(round(100*e)/100) '\sigma (normalized distance euclidean norm)']; %%%%%%%%%%%%%%%%% local CRP, fixed neigbours amount case 5 errcode=115; if e>=1 e=round(e)/100; txt=['The value for fixed neigbours amount has to be smaller '... 'than one. Continue the computation with a value of ' ... num2str(e)]; if nogui==0 warndlg(txt,'Threshold value mismatch'); drawnow waitforbuttonpress set(findobj('Tag','Size','Parent',gcf),'String',num2str(e)) end end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Reshape Embedding Vectors'),drawnow set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Compute Distance Matrix'),drawnow if m>1 s=sqrt(sum(((x1(:,:)-y1(:,:)).^2)')); else s=abs(x1(:,1)-y1(:,1)); end if check_stop(hCRP,hCtrl,nogui,obj), return, end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Sort Distance Matrix'),drawnow mine=round(Ny*e); [SS, JJ]=sort(reshape(s,Ny,Nx)); JJ=JJ'; if check_stop(hCRP,hCtrl,nogui,obj), return, end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Building CRP Matrix'),drawnow X1(Nx*Ny)=uint8(0); X1(JJ(:,1:mine)+repmat([0:Ny:Nx*Ny-1]',1,mine))=uint8(1); if check_stop(hCRP,hCtrl,nogui,obj), return, end X=reshape(X1,Ny,Nx); clear X1 SS JJ s matext=[num2str(round(1000*mine/Ny)/10) '% (fixed neighbours amount)']; %%%%%%%%%%%%%%%%% local CRP, interdependent neigbours case 6 errcode=116; warning('Method not available!') matext=''; %%%%%%%%%%%%%%%%% order matrix case 7 errcode=117; warning('Method not available!') matext=''; %%%%%%%%%%%%%%%%% order pattern recurrence plot case 8 errcode=118; set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Compute Order Patterns'),drawnow % create a order pattern test cmdStr = ''; for i=2:m; cmdStr = [cmdStr, ' permX(:,', num2str(i-1) ,') < permX(:,', num2str(i), ') + eps']; if i < m, cmdStr = [cmdStr, ' &']; end end if m==1 cmdStr = '1'; disp('Warning: No order patterns for dimension one; please use higher dimension!') end % order patterns by permutation of the set of values clear patt* for i=1:size(x,1) permX=perms(x(i,:)); orderPattern = find(eval(cmdStr)); if isempty(orderPattern) orderPattern = 0; end pattX(i) = orderPattern(1); end for i=1:size(y,1) permX=perms(y(i,:)); orderPattern = find(eval(cmdStr)); if isempty(orderPattern) orderPattern = 0; end pattY(i) = orderPattern(1); end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Create Order Patterns Matrix'),drawnow px = permute(pattX', [ 1 3 2 ]); py = permute(pattY', [ 3 1 2 ]); X = px(:,ones(1,length(y)),:) == py(ones(1,length(x)),:,:); X = X'; if check_stop(hCRP,hCtrl,nogui,obj), return, end matext=''; %%%%%%%%%%%%%%%%% global CRP case length(check_meth) errcode=110+length(check_meth); set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Reshape Embedding Vectors'),drawnow set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Compute Distance Matrix'),drawnow if m>1 s=sqrt(sum(((x1(:,:)-y1(:,:)).^2)')); else s=abs(x1(:,1)-y1(:,1)); end if check_stop(hCRP,hCtrl,nogui,obj), return, end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'String','Building CRP Matrix'),drawnow X=reshape(s,Ny,Nx); matext=''; end end % end plugin if nogui==0 for i=1:length(obj.enable), set(obj.children(i),'Enable',obj.enable{i}); end set(h(1),'String','Create Recurrence Plot',... 'ToolTip','Starts the computation - be patient.',... 'Callback','crp2 compute') setptr([hCRP,hCtrl],'arrow') end %%%%%%%%%%%%%%%%% show CRP if nogui==0 Shuttle.hCRP=hCRP; Shuttle.hCtrl=hCtrl; Shuttle.matext=matext; Shuttle.xscale=xscale; Shuttle.yscale=yscale; Shuttle.mflag=mflag; Shuttle.m=m; Shuttle.t=t; Shuttle.cm=cm; Shuttle.txt_cross=txt_cross; show_crp(X,Shuttle) else if nargout==1, xout=X; end end if strcmpi(get(findobj('Tag','SetPoint','Parent',hCtrl),'Enable'),'off') set(findobj('Tag','TextLOSsearch','Parent',hCtrl),'Enable','On') set(findobj('Tag','SetPoint','Parent',hCtrl),'Enable','On') set(findobj('Tag','ClearPoint','Parent',hCtrl),'Enable','On') set(findobj('Tag','ClearAllPoint','Parent',hCtrl),'Enable','On') set(findobj('Tag','LOSwidthXtext','Parent',hCtrl),'Enable','On') set(findobj('Tag','LOSwidthX','Parent',hCtrl),'Enable','On') set(findobj('Tag','LOSwidthYtext','Parent',hCtrl),'Enable','On') set(findobj('Tag','LOSwidthY','Parent',hCtrl),'Enable','On') set(findobj('Tag','Apply2','Parent',hCtrl),'Enable','On') end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% store2 case 'store2' errcode=15; t=get(findobj('Tag','Apply2','Parent',hCtrl),'UserData'); if isempty(t) warndlg('The LOS vector is still empty. Please start the computation of the LOS before storing.','No LOS') waitforbuttonpress else assignin('base','t_out', t) end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LOSmove case 'LOSmove' errcode=16; if isempty(get(gco,'UserData')) set(gco,'UserData',1,'ButtonDownFcn','crp2 LOSmove_end') set(gcf,'WindowButtonMotionFcn','crp2 LOSmove') end h1 = round(get(gca,'CurrentPoint')); set(gco, 'XData', h1(1,1), 'YData', h1(1,2)) clear h1 case 'LOSmove_end' errcode=161; if ~isempty(get(gco,'UserData')) set(gco,'UserData',[],'ButtonDownFcn','') set(gcf,'WindowButtonMotionFcn','') end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LOSclear case 'LOSclear' errcode=17; if gcf==hCtrl figure(hCRP) k=waitforbuttonpress; h1 = round(get(gca,'CurrentPoint')); h1(2,:)=[]; h1(:,3)=[]; finalRect = rbbox; h2 = round(get(gca,'CurrentPoint')); h2(2,:)=[]; h2(:,3)=[]; h(1,1)=min(h1(:,1),h2(:,1));h(2,1)=max(h1(:,1),h2(:,1)); h(1,2)=min(h1(:,2),h2(:,2));h(2,2)=max(h1(:,2),h2(:,2)); i=find(fixp(:,1)>=h(1,1) & fixp(:,2)>=h(1,2) & fixp(:,1)<=h(2,1) & fixp(:,2)<=h(2,2)); for j=1:length(i); delete(findobj('tag','fixp','Parent',findobj('Parent',hCRP,'Tag','CRPPlot'),'xdata',fixp(i(j),1))), end else h(1,1)=get(gco,'XData');h(1,2)=get(gco,'YData'); delete(gco) end clear h %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LOSallclear case 'LOSallclear' errcode=171; delete(findobj('tag','fixp','Parent',findobj('Parent',hCRP,'Tag','CRPPlot'))) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LOSset case 'LOSset' errcode=18; if gcf==hCtrl figure(hCRP) ginput(1); end h=round(get(gca,'currentp')); fixp(end+1,1)=h(1,1); fixp(end,2)=h(1,2); [i j]=sort(fixp(:,1)); fixp=fixp(j,:); h0=uicontextmenu; line(h(1,1),h(1,2),1000,... 'MarkerSize',12,... 'Marker','.',... 'Color',[1 0 0],... 'Tag','fixp',... 'UIContextMenu',h0) uimenu(h0, 'Label', 'Set Point', 'Callback', 'crp2 LOSset') uimenu(h0, 'Label', 'Move Point', 'Callback', 'crp2 LOSmove') uimenu(h0, 'Label', 'Clear Point', 'Callback', 'crp2 LOSclear') clear h h0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LOSsearch case 'LOSsearch' errcode=19; if nogui==0 setptr([hCRP,hCtrl],'watch') h=findobj('Tag','Apply2','Parent',hCtrl); obj.children=get(hCtrl,'Children'); obj.enable=get(obj.children,'Enable'); set(obj.children,'Enable','off') set(h(1),'String','Stop',... 'ToolTip','Stops the computation.',... 'Enable','on',... 'Callback','set(gcbo,''String'',''Stopped'')') end x0=0; y0=0; Dmax1=str2num(get(findobj('Tag','LOSwidthX','Parent',hCtrl),'string')); Dmax2=str2num(get(findobj('Tag','LOSwidthY','Parent',hCtrl),'string')); X=double(get(findobj('Tag','CRPData','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')),'UserData')); N=size(X); Nleer=0; Nvoll=0; minvalue=min(min(X));maxvalue=max(max(X)); if (length(find(X==minvalue))+length(find(X==maxvalue))==length(X(:))) flagpoint=0; % looks for the beginning of the diagonal LOS errcode=191; for i=1:N(2); if check_stop_LOS(hCRP,hCtrl,nogui,obj), break, end if i<=N(1) if ~isempty(fixp), if i>=fixp(1,1), x0=fixp(1,1); y0=fixp(1,2); end, end if X(i+y0,1+x0)~=0 v=i+y0; h=1+x0; break end end if X(1+y0,i+x0)~=0 h=i+x0; v=1+y0; break end end Nleer=i-1; % t(1:v)=h; t(1+x0:h)=v; % start estimation of the LOS errcode=192; mflag=0; i=2; % h_wait=waitbar(0,'Compute LOS ...',props.window); h_wait=waitbar(0,'Compute LOS ...'); set(h_wait,'HandleVisibility','on'); while h<N(2)-1 & v<N(1)-1 & mflag~=1, waitbar(h/N(2)) if check_stop_LOS(hCRP,hCtrl,nogui,obj), break, end dw=1; W=X(v:v+dw,h:h+dw); W(1,1)=0; if ~isempty(fixp) if find(h==fixp(:,1)) dv=fixp(find(h==fixp(:,1)),2)-v; dh=1; flagpoint=1; end end if flagpoint==0; % looks for the existence of the next recurrence point in diagonal direction errcode=193; while sum(sum(W))==0 & mflag==0 & flagpoint==0, Nleer=Nleer+1; if ~isempty(fixp) if find(h+dw==fixp(:,1)) dv=fixp(find(h+dw==fixp(:,1)),2)-v; W=1; dh=dw; flagpoint=1; break end end dw=dw+1; if v+dw < N(1) & h+dw < N(2) W=X(v:v+dw,h:h+dw); W(1,1)=0; else mflag=1; end end if mflag==1 break end % determines the coordinates of the next recurrence point errcode=194; dh0=min(find(sum(W))); dv0=min(find(sum(W'))); dh=min(find(W(dv0,:))); dv=min(find(W(:,dh0))); if dh>dh0, dh=dh0;end if dv>dv0, dv=dv0;end % determines the local width of the diagonal LOS errcode=195; dh1=dh; dv1=dv; % neues Fenster WL1=Dmax1; WL2=Dmax2; if v+dv1-2+WL2>=N(1), WL2=N(1)-(v+dv1-2); end if h+dh1-2+WL1>=N(2), WL1=N(2)-(h+dh1-2); end Wn=X(v+dv1-1:v+dv1-2+WL2,h+dh-1:h+dh-2+WL1); % Schwerpunkt davon ausrechnen if sum(sum(Wn))~=0, Sh=sum(sum(Wn).*[1:WL1])/sum(sum(Wn));else Sh=WL1/2;end if sum(sum(Wn'))~=0,Sv=sum(sum(Wn').*[1:WL2])/sum(sum(Wn'));else Sv=WL2/2;end % neue Dmax berechnen if Sh>=Sv, Dmax2n=WL1*Sv/Sh; Dmax1n=WL1; end if Sv>Sh, Dmax1n=WL2*Sh/Sv; Dmax2n=WL2; end % while X(v+dv1-1,h:dh-1)==1 & v+dv1-1<N(1) &dv1<Dmax2 while X(v+dv1-1,h+dh-1)==1 & v+dv1-1<N(1) &dv1<Dmax2n dv1=dv1+1; end % while X(v:dv-1,h+dh1-1)==1 & h+dh1-1<N(2) & dh1<Dmax1 while X(v+dv-1,h+dh1-1)==1 & h+dh1-1<N(2) & dh1<Dmax1n if ~isempty(fixp) if find(h+dh1-1==fixp(:,1)) & find(h+fix((dh1+dh)/2)==fixp(:,1)) dv=fixp(find((h+dh1-1)==fixp(:,1)),2)-v; if isempty(dv), dv=fixp(find((h+fix((dh1+dh)/2))==fixp(:,1)),2)-v; end flagpoint=1; break end end dh1=dh1+1; end % compute the mean of the diagonal LOS errcode=196; if flagpoint==0 dh=fix((dh1+dh)/2); dv=fix((dv1+dv)/2); if dh>0 dh=dh-1; end if dv>0 dv=dv-1; end % dh=dh+dh1; end end % flagpoint end flagpoint=0; % output if dh~=0 & dv~=0 t(h:h+dh)=v:dv/dh:v+dv; elseif dv~=0 t(h)=v+dv; elseif dv==0 t(h:h+dh)=v; end Nvoll=Nvoll+sqrt(dv^2+dh^2); if dh==0 & dv==0 dh=1; end % moves the startpoint for further looking h=h+dh; v=v+dv; end else % DTW algorithm h_wait=waitbar(0,'Compute LOS ...'); set(h_wait,'HandleVisibility','on',props.window); t=1; i=y0+1; j=x0+1; flag2=0; while i<N(1)-Dmax1-1 & j<N(2)-Dmax2-1 errcode=197; waitbar(i/N(1)), j0=j; % [temp pos]=min([sum(sum(X(i:i+Dmax1,j+1:j+1+Dmax2))),sum(sum(X(i+1:i+1+Dmax1,j+1:j+1+Dmax2))),sum(sum(X(i+1:i+1+Dmax1,j:j+Dmax2)))]); [temp pos]=min([(mean(X(i,j+1:j+1+Dmax2))),(mean(diag(X(i+1:i+1+Dmax1,j+1:j+1+Dmax2)))),(mean(X(i+1:i+1+Dmax1,j)))]); switch(pos) case 1 j=j+1; flag1=1; case 2 i=i+1; j=j+1; flag1=1; flag2=1; case 3 i=i+1; flag2=1; end if ~isempty(fixp) & flag1==1 & flag2==1 errcode=1981; h=find(fixp(:,1)==j); if ~isempty(h) & i<max(fixp(h,2)); h2=find(i<=fixp(h,2)); i=fixp(h(h2(1)),2); flag1=0; end end if ~isempty(fixp) & flag2==1 & flag1==1 errcode=1982; h=find(fixp(:,2)==i); if ~isempty(h) & j<max(fixp(h,1)); h2=find(j<=fixp(h,1)); j=fixp(h(h2(1)),1); t(j0:j-1)=t(j0); flag2=0; end end t(j)=i; end t(find(~t))=1; end delete(h_wait) errcode=199; h1=findobj('Parent',hCRP,'Tag','CRPPlot'); h2=findobj('Tag','Diagonal','Parent',h1); if isempty(h2) h2=line('Parent',h1,'visible','on','Tag','Diagonal','color',[1 0 0],... 'LineWidth',1); end set(h2,'xdata',[1:length(t)],'ydata',t,'visible','on') set(findobj('Tag','Apply2','Parent',hCtrl),'UserData',t) if nogui==0 setptr([hCRP,hCtrl],'arrow') h=findobj('Tag','Apply2','Parent',hCtrl); set(h(1),'String','Apply',... 'ToolTip','Searches the LOS.',... 'Callback','crp2 LOSsearch') for i=1:length(obj.enable), set(obj.children(i),'Enable',obj.enable{i}); end end set(findobj('Tag','Store2','Parent',hCtrl),'Enable','On') end try, set(0,props.root), end warning on set(0,'ShowHidden','Off') %%%%%%% error handling %if 0 catch try, if nogui==0 for i=1:length(obj.enable), set(obj.children(i),'Enable',obj.enable{i}); end set(h(1),'String','Apply',... 'ToolTip','Starts the computation - be patient.',... 'Callback','crp compute') setptr([hCRP,hCtrl],'arrow') end, end z=whos;x=lasterr;y=lastwarn;in=varargin{1}; print_error('crp2',z,x,y,in,mflag,action) try, set(0,props.root), end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function out=check_stop_LOS(hCRP,hCtrl,nogui,obj) global errcode errcode=errcode+.02; out=0; if nogui==0 h=findobj('Tag','Apply2','Parent',hCtrl); if strcmpi(get(h(1),'String'),'stopped') set(h(1),'String','Apply',... 'ToolTip','Searches the LOS.',... 'Callback','crp2 LOSsearch') for i=1:length(obj.enable), set(obj.children(i),'Enable',obj.enable{i}); end set(findobj('Tag','Status','Parent',findobj('Parent',hCRP,'Tag','CRPPlot')'),'String','Stopped'),drawnow setptr([hCRP,hCtrl],'arrow') out=1; end end