function [PCA,V,EC]=computa_EOF(lat,lon,filename,num_EOF)
% num_EOF numero de componentes deseadas
%% Chequeo de errores de entrada
aux=size(filename);
if aux(1)~=length(lat)
    error('la dimension de lat no coincide con la dimension de filename')
end
if aux(2)~=length(lon)
    error('la dimension de lon no coincide con la dimension de filename')
end
if num_EOF>aux(3)
    error('el numero de componentes principales debe < que la cantidad de tiempos')
end
if any(any(any(isnan(filename))))==1
    error('No pueden haber NaN en la Matriz, sacarlos!')
end
%%
%retira la media anual de los datos con una media movil de 6 meses
F=zeros(aux(1),aux(2),aux(3));
for i=1:aux(1)
    for j=1:aux(2)
       F(i,j,:)= squeeze(filename(i,j,:))';%- media_movil( filename(i,j,:),3);
    end
end

%permuta las columnas de acuerdo a la funcion EOF. (tiempo, lat, lon)
var=permute(F,[3 1 2]);  

%%
MATRIZ=zeros(aux(3),aux(1)*aux(2));
puntos=1;
for i=1:aux(1)     
	for j=1:aux(2) 
        %Agrega un factor de peso dependiendo de la latitud. 
        %Organiza los datos en una matriz. cada columnas es una posiciones(lat
        %lon) y cada fila son los distintos tiempos en esa posicion.
        MATRIZ(:,puntos)=sqrt(cos((pi/180)*lat(i)))*var(:,i,j); 
        puntos=puntos+1;
    end
end
%%
%Comenzando el calculo de autovalores (EOF)


[V,EOFs,EC,ERROR]=EOF(MATRIZ,num_EOF);
% EOFs= Matriz con las EOFs en las columnas (Va a tener num_EOF filas)
% V = vector con los autovaloires asociados
% EC = EOF Coeficientes
% error = the reconstruction error (L2-norm)

variabilidad=V/sum(V);

%%
% Ahora debe rearmarse la matriz lat, lon para poder graficar cada EOF
for ii=1:num_EOF
    PCA{ii}=reshape(EOFs(:,ii),[aux(2) aux(1)])';
end
    
    
LAT_inf=lat(1);
LAT_sup=lat(end);
%opcional graficar
[X,Y] = meshgrid(lon,lat);
for i=1:num_EOF
    figure(i)
    worldmap([LAT_inf LAT_sup],[-180 180])    
    geoshow(Y,X,PCA{i},'DisplayType','texturemap')
    load coast
    geoshow(lat,long,'LineWidth',2,'color','black')
    title(strcat('PCA Nº',sprintf('%g',i),'. variabilidad=',sprintf('%g',variabilidad(i))));
    colorbar
end

a=1





