Mercurial > hg > ltpda
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