Global Index (short | long) | Local contents | Local Index (short | long)
[lamda, loadings, pcs, per] = ceof(data, nkp);
Complex (Hilbert) EOF:
[lamda, loadings, pcs, per] = ceof(data);
Outputs:
lamda = eigenvalues (should be pretty close to real)
loadings = First 10 Complex Loadings (row dimension)
pcs = First 10 Complex Principal Components (column dim)
per = percent variance explained (real)
Inputs:
data = data, so that size(data) = [ntime nspace]
nkp = number of modes to output (default = 10);
Note: pcs can be found by performing the following:
pcs = data * loadings(:,1:10);
Normalization is such that:
loadings' * loadings = diag(ones(1,npt));
pcs' * pcs = diag(lamda);
For display purposes, the following patterns and time
series go together:
real(loadings) goes with real(pcs);
imag(loadings) goes with imag(pcs) = hilbert(real(pcs))
Also, one can divide the pcs by sqrt(lamda) and multiply the
loadings by sqrt(lamda) to get actual amplitudes. Recall,
std(real(pcs)) should equal std(imag(pcs)).
| This function is called by | |
|---|---|
function [lamda, loadings, pcs, per] = ceof(data, nkp);
% a = 0.1:.1:10;
% for i = 0:199
% data((i+1),:) = sin(pi*(0.5*a + 0.1*i)) + 5*(rand(1,100)-0.5);
% end
% data = (data - ones(200,1)*mean(data));
if nargin < 2; nkp = 10; end;
if nargin < 1; error('Need to input data'); end;
[ntim, npt] = size(data);
disp('Calculating hilbert matrix')
%data = data + j * hilbert(data);
data = hilbert(data);
disp('Done with hilbert matrix, calculating covariance matrix')
c = data' * data / ntim;
disp('Covariance matrix computed, starting eig(c)')
[loadings, lamda] = eig(c);
l = diag(lamda);
[lamda,k] = sort(l'); loadings = loadings(:,k);
lamda = fliplr(lamda);
loadings = fliplr(loadings);
loadings = loadings(:,1:nkp);
per = real(lamda*100/sum(lamda));
pcs = data * loadings;
% loadings = loadings(:,1:100);
% pcs = data * loadings(:,1:10);