diff m-toolbox/classes/+utils/@math/xCovmat.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/+utils/@math/xCovmat.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,135 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Compute cross covariance matrix of two data series
+% 
+% CALL 
+% 
+% Get autocovariance
+% cmat = xCovmat(x)
+% cmat = xCovmat(x,[])
+% cmat = xCovmat(x,[],'cutbefore',10,'cutafter',10)
+% 
+% Get crosscovariance
+% cmat = xCovmat(x,y)
+% cmat = xCovmat(x,y,'cutbefore',10,'cutafter',10)
+% 
+% INPUT
+% 
+% - x, y, data series
+% - cutbefore, followed by the data samples to cut at the starting of the
+% data series
+% - cutafter, followed by the data samples to cut at the ending of the
+% data series
+% 
+%
+% L Ferraioli 10-10-2010
+%
+% $Id: xCovmat.m,v 1.1 2010/11/16 16:41:37 luigi Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function cmat = xCovmat(x,y,varargin)
+
+  acov = true;
+  % willing to work with columns
+  if size(x,1)<size(x,2)
+    x = x.';
+  end
+  % subtract the mean
+  x = x - mean(x);
+  if nargin > 1
+    if ~isempty(y) % crosscovariance
+      acov = false;
+      if size(y,1)<size(y,2)
+        y = y.';
+      end
+      y = y - mean(y);
+    end
+  end
+  
+  nx = size(x,1);
+
+  cutbefore = [];
+  cutafter = [];
+  if ~isempty(varargin)
+    for j=1:length(varargin)
+      if strcmp(varargin{j},'cutbefore')
+        cutbefore = varargin{j+1};
+      end
+      if strcmp(varargin{j},'cutafter')
+        cutafter = varargin{j+1};
+      end
+    end
+  end
+  
+  if acov % autocovariance
+    
+    % init trim matrix
+    trim = zeros(nx,nx);
+    % fillin the trim matrix
+    for ii=1:nx
+      trim(1:nx-ii+1,ii) = x(ii:nx,1);
+    end
+    %trim = sparse(trim);
+    cmat = trim*conj(trim);
+    % normalization
+    %nmat = sparse(triu(ones(nx,nx),0));
+    nmat = triu(ones(nx,nx),0);
+    nmat = rot90(nmat);
+    normat = nmat*nmat;
+    cmat = cmat./normat;
+    %cmat = full(cmat);
+    
+    if ~isempty(cutbefore)
+      % cut rows
+      cmat(1:cutbefore,:)=[];
+      % cut columns
+      cmat(:,1:cutbefore)=[];
+    end
+    [nn,mm]=size(cmat);
+    if ~isempty(cutafter)
+      % cut rows
+      cmat(nn-cutafter:nn,:)=[];
+      % cut columns
+      cmat(:,mm-cutafter:mm)=[];
+    end
+    
+  else % cross covariance
+    
+    % init trim matrix
+    trimx = zeros(nx,nx);
+    trimy = zeros(nx,nx);
+    % fillin the trim matrix
+    for ii=1:nx
+      trimx(1:nx-ii+1,ii) = x(ii:nx,1);
+      trimy(1:nx-ii+1,ii) = y(ii:nx,1);
+    end
+    cmat = trimx*conj(trimy);
+    % normalization
+    nmat = triu(ones(nx,nx),0);
+    nmat = rot90(nmat);
+    normat = nmat*nmat;
+    cmat = cmat./normat;
+    
+    if ~isempty(cutbefore)
+      % cut rows
+      cmat(1:cutbefore,:)=[];
+      % cut columns
+      cmat(:,1:cutbefore)=[];
+    end
+    [nn,mm]=size(cmat);
+    if ~isempty(cutafter)
+      % cut rows
+      cmat(nn-cutafter:nn,:)=[];
+      % cut columns
+      cmat(:,mm-cutafter:mm)=[];
+    end
+    
+  end
+  
+
+
+
+
+
+end
\ No newline at end of file