Skip to content
Snippets Groups Projects
crp2.m 46.3 KiB
Newer Older
marwan's avatar
marwan committed
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.
marwan's avatar
marwan committed
%      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 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 4.7  2004/11/10 07:04:40  marwan
% initial import
%
marwan's avatar
marwan committed
%
% 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
marwan's avatar
marwan committed
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
  s=eye(m);
marwan's avatar
marwan committed

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 & m > 1, 
          m=1; ds = 1;
          disp('Warning: For order matrix a dimension of one is used.')
      end
marwan's avatar
marwan committed
      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
marwan's avatar
marwan committed
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
   return
marwan's avatar
marwan committed
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'};
marwan's avatar
marwan committed
       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
marwan's avatar
marwan committed

  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
marwan's avatar
marwan committed

  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
marwan's avatar
marwan committed

  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
marwan's avatar
marwan committed

  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
marwan's avatar
marwan committed

  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
marwan's avatar
marwan committed

  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
marwan's avatar
marwan committed

  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',...
marwan's avatar
marwan committed
	    'Position',[.16 .509 .67 .032],...
	    'Tag','Method',...
	    'ToolTip','Select the method of finding neighbours.');

  if method==9, set(h2,'Enable','Off'); else, set(h2,'Value',method); end
marwan's avatar
marwan committed

  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
marwan's avatar
marwan committed


  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
marwan's avatar
marwan committed
544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965

  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')
  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
  
  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 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
marwan's avatar
marwan committed
  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