Code covered by the BSD License  

Highlights from
PCAtool

image thumbnail
from PCAtool by Guillaume MAZE
Compute everything you need for EOF,EEOF,CEOF,SVD,lagged SVD

test_pcatool.m
% Here is a simple script to test caleof.m from PCATOOL package.
% 

% gmaze@mit.edu
% 2006/07/31
%

clear

field = 1; % The best one

% Generate the data
x = -10 : 1 : 10 ;
y = x;
[X,Y] = meshgrid(x,y);

switch field
 case 1   % H. Bjornson and S.A. Venegas
   HH = 12*( 1.2 - 0.35*sqrt( (X-0).^2 + (Y-0).^2 ) );
   HH = HH - mean(mean(HH));
   H(1,:,:) = 1012 + HH;
   H(2,:,:) = 1012 + (1012-squeeze(H(1,:,:)));;
   H(3,:,:) = 1022.8 - 3.6*Y;
   H(4,:,:) = 1012 + (1012-squeeze(H(3,:,:)));
   H(5,:,:) = 1001.2 + 3.6*X;
   H(6,:,:) = 1012 + (1012-squeeze(H(5,:,:)));
  cont = [980:5:1050];
  N = 2;
  
 case 11   % H. Bjornson and S.A. Venegas modified
   % Here it must be only 2 non-zero EOF (45degre oriented ) of similar variance 50%
   H = ones(4,length(x),length(y));
   H(1,:,:) =  Y;
   H(2,:,:) = -Y;
   H(3,:,:) = X;
   H(4,:,:) = -X;
   N = 2;

 case 2 % Hartmann eg:  analysis in place
  a = [2 4 -6 8 ; 1 2 -3 4];
  H(1,:,:) = a(1,:)';
  H(2,:,:) = a(2,:)';
  
  % Get EOFs:
  N = 4;
  for method = 2 : -1 : 1
    [E,pc,expvar] = caleof(H,N,method);
    %E'
  end

  return
  
 case 3  % My signal
  np = 4; % Numer of random signal (...and eof)
  nt = 10; % Number of timestep
  H = zeros(nt,length(x),length(y));
  for ip = 1 : np
    xc(ip) = abs(fix(rand(1)*10));
    yc(ip) = abs(fix(rand(1)*10));
    if ip>=fix(np/2)
      xc(ip) = -xc(ip);
      yc(ip) = -yc(ip);
    end
    dd(ip) = fix(rand(1)*10);
  end %for ip
  f = 1/nt;
  for it = 1 : nt 
    H2 = zeros(length(x),length(y));
    for ip = 1 : ip
        if it==1,[xc(ip) yc(ip) dd(ip)],end
        HH = 12*( 1.2 - 0.35*sqrt(  ((X-xc(ip)).^2 + (Y-yc(ip)).^2 )/dd(ip) ));
        H2 = HH - mean(mean(HH));
	H(it,:,:) = squeeze(H(it,:,:)) + H2.*cos(pi*it/dd(ip)) ;
    end %for ip
  end %for it
  H = 1012 + H;
  cont = [980:5:1050];
  N = 3;
  
 case 4 % My signal 2
  x = -pi : pi/6 : pi ;
  y = x;
  [X,Y] = meshgrid(x,y);
  HH  = cos(X) + cos(Y);
  HH2 = cos(Y);
  nt = 12;
  for it = 1 : nt
%     H(it,:,:) = cos(pi*it/nt)*HH; cont=[-2 2];
     H(it,:,:) = 2*cos(pi*it/nt)*HH + 3*cos(pi*it/nt/2)*HH2; cont=[-10 10];
     xtrm(squeeze(H(it,:,:)));
  end
  cont=[-2 2];
  N = 3;
  
end % switch field

%return

% Plot field time serie:
if 1
figure;iw=2;jw=size(H,1)/iw;
set(gcf,'position',[11 533 560 420]);

for i=1:iw*jw
  C = squeeze(H(i,:,:));
  
  subplot(iw,jw,i);
  pcolor(X,Y,C);
  title(num2str(i));
  if i==1,cx=caxis;end
  axis square
  caxis(cx);

end %for i
end %fi
%return

% Get EOFs:
G = map2mat(ones(size(H,2),size(H,3)),H);

for method = 1 : 4
  [E,pc,expvar] = caleof(G,N,method);  
  eof = mat2map(ones(size(H,2),size(H,3)),E);
  

figure;iw=1;jw=N+1;
set(gcf,'MenuBar','none');
posi = [576 0 710 205];
set(gcf,'position',[posi(1) (method-1)*250+50 posi(3) posi(4)]);

for i=1:iw*jw
  if i<= iw*jw-1
    
  C = squeeze(eof(i,:,:));
  subplot(iw,jw,i);
  cont = 12;
  [cs,h] = contourf(X,Y,C,cont);
  clabel(cs,h); 
  title(strcat('EOF:',num2str(i),'/',num2str(expvar(i)),'%'));
  axis square;
  %caxis([cont(1) cont(end)]);
  
  else
  subplot(iw,jw,iw*jw);
  plot(pc');
  grid on
  xlabel('time')
  title('PC')
  legend(num2str([1:N]'),2);
  box on
  

  end %if
  
end %for i
suptitle(strcat('METHODE:',num2str(method)));

end %for method


Contact us at files@mathworks.com