- 积分
- 79
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2015-12-6
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我理解的多变量EOF分解就是将多个变量合成为一个变量然后进行EOF分解
1.理论学习部分
MV_EOF相关介绍在http://bbs.06climate.com/forum.php?mod=viewthread&tid=20871说的特别详细
下面是我参考的MV_EOF的matlab的例子
话不多少直接上图
额一贴图他就是显示字数超了看下PDF吧。。。抱歉QQ1,QQ2,QQ3是重点内容的截图
2实践操作
2.1SST和U850处理
使用的是OISST和NCEP纬向风月平均资料
- <font size="4">clc
- clear
- close all;
- ncid = netcdf.open('E:\study\monsoon\uwnd.mon.mean.nc','NOWRITE');
- ncid = netcdf.open('E:\study\monsoon\sst.mnmean.nc','NOWRITE');
- ncdisp E:\study\monsoon\uwnd.mon.mean.nc;
- ncdisp E:\study\monsoon\sst.mnmean.nc;
- u= ncread('E:\study\monsoon\uwnd.mon.mean.nc','uwnd');
- %U 144*73*17*823 2.5*2.5 1948.1.1-2016.7.1 1000, 925, 850, 700, 600, 500, 400, 300, 250, 200, 150, 100, 70, 50, 30, 20, 10
- sst=ncread('E:\study\monsoon\sst.mnmean.nc','sst');
- % SST 360*180*423 1*1 1981.12.1-2017.2.1
- %%
- %拼成一个新矩阵
- %取U850 1981.1.1-2016.7.1
- U=squeeze(u(17:49,29:45,3,(1982-1948)*12+1:end));
- U=double(U);
- sst1=sst(41:121,70:111,2:416);
- %将lon,lat化为一维
- for i=1:1:415;
- sst2=squeeze(sst1(:,:,i));
- sst3(:,i)=reshape(sst2,1,3402);
- end
- %标准化
- sst4=zeros(3402,415);
- for i=1:12;
- sstn(:,i)=nanmean(sst3(:,i:12:end),2);
- end
- for j=1:3402;
- for i=1:12
- sst4(j,i:12:end)=(sst3(j,i:12:end)-sstn(j,i))/std(sst3(j,:));
- end
- end
- %插值
- xi=40:2.5:120;
- yi=-20:2.5:20;
- x=40.1:1:120.1;
- y=-20.5:1:20.5;
- x=double(x);
- y=double(y);
- xi=double(xi);
- yi=double(yi);
- [XX,YY]=meshgrid(yi,xi);%想要变成的格式
- [X,Y]=meshgrid(y,x);
- for i=1:415;
- U1(:,:,i)=griddata(XX,YY,U(:,:,i),X,Y,'v4');
- end;
- %将lon,lat化为一维
- for i=1:1:415;
- U2=squeeze(U1(:,:,i));
- U3(:,i)=reshape(U2,1,3402);
- end
- %标准化
- U4=zeros(3402,415);
- for i=1:12;
- Un(:,i)=nanmean(U3(:,i:12:end),2);
- end
- for j=1:3402;
- for i=1:12
- U4(j,i:12:end)=(U3(j,i:12:end)-Un(j,i))/std(j,:);
- end
- end
- SST_U=zeros(2,3402,415);
- SST_U(1,:,:)=sst4;
- SST_U(2,:,:)=U4;
- save SST_U SST_U</font>
复制代码
2.2进行MV-EOF分解
- <font size="4"><p><font size="5">clc
- clear
- close all;
- load SST_U.mat
- for i=1:1:415
- SST_U1=squeeze(SST_U(:,:,i));
- SST_U2(:,i)=reshape(SST_U1,1,6804);
- end
- SST_U2(SST_U2<-1000000)=0;
- SST_U_nan=isnan(SST_U2);
- i=0;
- for j=1:6804;
- if sum(SST_U_nan(j,:))==0;
- i=i+1;
- SST_U3(i,:)=SST_U2(j,:);
- end
- end
- X=zeros(6804,415);
- for j=1:1:6804
- for i=1:1:12
- y(j,i)=mean(SST_U3(j,i:12:end));
- X(j,i:12:end)=SST_U3(j,i:12:end) - y(j,i);
- end
- end
- %EOF分解
- S=X'*X;
- [v,d]=eig(S);
- v=fliplr(v); % 矩阵作左右翻转
- d=rot90(d,2); % 矩阵上下翻转后再左右翻转(查看生成的对角阵是由小到大排列的~此指令可使其由大到小排列~fliplr(flipud(d))=rot90(d,2))
- diagonal=diag(d); %d为特征跟%diag(v,k)以向量v的元素作为矩阵X的第k条对角线元素,当k=0时,v为X的主对角线;当k>0时,v为上方第k条对角线;当k<0时,v为下方第k条对角线。
- LR=X*v; %LR为时间系数矩阵
- for i=1:1:415;
- LR(:,i)=LR(:,i)/sqrt(diagonal(i));
- end
- Ym=LR'*X;%时间系数
- sum_d=sum(diagonal);
- for i=1:415;
- G(i)=diagonal(i)/sum_d; % G2(i)是方差贡献率
- end
- SST_U_L=zeros(6804,415);
- SST_U_L(:,:)=NaN;
- i=1;
- for j=1:6804;
- if sum(SST_U_nan(j,:))==0;
- SST_U_L(j,:)=LR(i,:);%空间系数
- i=i+1;
- end
- end
- %将空间模态分开两个变量,只考虑第一模态
- K=reshape(SST_U_L(:,1),2,3402);</font></p><p><font size="5"> KK=reshape(K(1,:),81,42);
- KK2=reshape(K(2,:),81,42);
- %参考PPT的分解是下面的
- eSST=SST_U_L(1:3402,:);
- eU=SST_U_L(3403:end);
- %将经纬度分开
- eeSST=reshape(eSST(:,1),81,42);
- save SST_U_L SST_U_L</font>
复制代码 3,结果讨论
只画了第一模态的图
图1是按PPT方法画出来的
图2,3是我自己想的
结果和周磊老师分析的差别非常大,不知道是什么原因
希望有人可以给看看
周磊老师的图也在附件中
|
-
-
-
-
-
图2,第一模态空间
-
图3
-
-
-
SST_U.m
1.6 KB, 下载次数: 28, 下载积分: 金钱 -5
-
-
EOFSST_U.m
3.05 KB, 下载次数: 40, 下载积分: 金钱 -5
-
-
MV_EOF.pdf
1.94 MB, 下载次数: 140, 下载积分: 金钱 -5
评分
-
查看全部评分
|