当前位置:文档之家› EOF分解程序

EOF分解程序

EOF分解程序
EOF分解程序

fid=fopen('','r');

Num=360;

data=zeros(360,180,Num);

for i=1:Num

aaa=fscanf(fid,'%s',7);

data(:,:,i)=fscanf(fid,'%f',[360,180]); end

sst1=data(1:90,11:70,1:Num); sst2=data(311:360,11:70,1:Num);

sst3=zeros(140,60,Num); sst3(90:-1:1,1:60,1:Num)=sst1; sst3(140:-1:91,1:60,1:Num)=sst2; sst=sst3;

for i=1:140

for j=1:60

for k=1:Num

if(sst(i,j,k)==-1000)||((sst(i,j,k)==-32768))

sst(i,j,k)=NaN;

end

end

end

end

end X=zeros(size(sst_region));

for i=1:12 X(i:12:Num-12+i,:)=sst_region(i:12:end,:)

repmat( mean(sst_region(i:12:end,:),1) , size(sst_region(i:12:end,:),1), 1); end

R=X*X'; % 的方阵 ~现定义矩阵 R=X'*X 是 156*156 的矩阵 sst_area1=zeros(Num,8400); for i=1:Num; squ=squeeze(sst(:,:,i)); 换为二维数

组 sst_area1(i,:)=reshape(squ,1,8400);

end sst_nan=isnan(sst_area1); i=0;

for j=1:8400 if sum(sst_nan(:,j))==0;

i=i+1; sst_region(:,i)=sst_area1(:,j);

end

% zeros 全零数组 执行该指令后 sst 数据转 将数据转变为二维

选取所需要区域的数据

求距平 ~注意季节的变换

学者给的程序

协方差矩阵 R=X*X' 是 8400*8400

[v,d]=eig(R); % 进行 EOF 分解-因为 X'*X 与X*X'的秩相同所以特征值相同 ~d 为x 的特征值组成的对角阵 ~v 为X*X'的特征向量-

[diagonal,I]=sort(diag(d),'descend'); v=v(:,I);

G=diagonal/sum(diagonal); Gs=0;

for i=1:length(G) Gs(i)=sum(G(1:i)); if Gs(i)> break; end end N=length(Gs)

%v=fliplr(v); %d=rot90(d,2);

翻转( 查看生成 的对 角 阵是由小到大排列的 ~此指令可使其由大到小排列

~fliplr(flipud(d))=rot90(d,2))

%diagonal=diag(d);

spacef=X'*v;

for i=1:Num;

spacef(:,i)=spacef(:,i)/sqrt(diagonal(i)); %

end

%**************************************************************************

将删去的陆地与冰点的填

充值补回

sst_area2=zeros(Num,8400); sst_area2(:,:)=NaN;

i=1;

spacef2=spacef';

for j=1:8400

if sum(sst_nan(:,j))==0;

sst_area2(:,j)=spacef2(:,i);

i=i+1;

end

end

sst_area3=sst_area2';

%************************************************************************** % 画图

%subplot(2,1,2) figure(1)

x=1:Num; plot(x,timef(:,1),'g'); %ylim([ -80 80 ]);

% xlabel('1980-1992 年 156 个月 ','fontsize',15,'fontname','

ylabel('INDEX','fontsize',12,'fontname',' 黑体 ') 矩阵作左右翻转 矩阵上下翻转后再左右 空间本征函数 timef=X*spacef;

sum_d=sum(diagonal);

count=0;

for i=1:Num;

count=count+diagonal(i);

G1(i)=count/sum_d;

end

for i=1:Num;

G2(i)=diagonal(i)/sum_d;

end

% G1(i) % G2(i) 时间本征函数 是累积方差贡献率 是方差贡献率 将绘图窗口划分为 2*1 个子窗口, 并在第 2 个子窗口中绘图

隶书 ')

set(gca,'xtick',(1:6:Num))

set(gca,'xticklabel',{'1980','','1981','','1982','','1983','','1984','','1985',

'','1986','','1987','','1988','','1989','','1990','','1991','','1992','','1993' }) title(' 北 太 平 洋 第 1 模 态 1980 至 1992 年 SST 时 间 序 列 ', 'color', 'k','fontsize',15,'fontname',' 幼圆 ') grid on hold off % %subplot(2,1,1)

% lon=[:];

% lat=[:];

% m_proj('Equidistant Cylindrical','lat',[ ],'lon',[ ]);

%

m_contourf(lon,lat,rot90(reshape(sst_area3(:,6),140,60)',2),30,'linestyle','non e');

% colorbar

% m_coast('patch',[.95 .95 .95]);

% m_coast('color','k');

% m_grid('linestyle','none','tickdir','out','linewidth',;

% % xlabel('longitude','fontsize',15,'fontname','comic sans ms');

% % ylabel('latitude','fontsize',15,'fontname','comic sans ms');

% title([' 北太平洋第 6 模态填色图 '],'fontsize',15,'fontname','

lon=[:];

lat=[:];

figure(2)

m_proj('lambert','lat',[ ],'lon',[ ]);

m_contourf(lon,lat,rot90(reshape(sst_area3(:,1),140,60)',2)); % colorbar; m_coast('patch',[1 .85 .7]); %m_elev('contourf',[500:500:6000]);

m_grid('box','fancy','tickdir','in');

%colormap(flipud(copper));

% xlabel('longitude','fontsize',15,'fontname',' 幼圆 '); %

ylabel('latitude','fontsize',15,'fontname',' 幼圆 ');

title([' 北太平洋第 1 模态填色图 '],'fontsize',15,'fontname','

colorbar 幼圆 ');

幼圆 ');

相关主题
文本预览
相关文档 最新文档