爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 25556|回复: 28

[讨论] Matleb多变量EOF(MV_EOF)程序讨论

[复制链接]

新浪微博达人勋

发表于 2017-4-16 22:08:05 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

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纬向风月平均资料

  1. <font size="4">clc
  2. clear
  3. close all;
  4. ncid = netcdf.open('E:\study\monsoon\uwnd.mon.mean.nc','NOWRITE');
  5. ncid = netcdf.open('E:\study\monsoon\sst.mnmean.nc','NOWRITE');
  6. ncdisp E:\study\monsoon\uwnd.mon.mean.nc;
  7. ncdisp E:\study\monsoon\sst.mnmean.nc;
  8. u= ncread('E:\study\monsoon\uwnd.mon.mean.nc','uwnd');
  9. %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
  10. sst=ncread('E:\study\monsoon\sst.mnmean.nc','sst');
  11. % SST 360*180*423 1*1 1981.12.1-2017.2.1

  12. %%
  13. %拼成一个新矩阵
  14. %取U850 1981.1.1-2016.7.1
  15. U=squeeze(u(17:49,29:45,3,(1982-1948)*12+1:end));
  16. U=double(U);
  17. sst1=sst(41:121,70:111,2:416);
  18. %将lon,lat化为一维
  19. for i=1:1:415;
  20.     sst2=squeeze(sst1(:,:,i));
  21.     sst3(:,i)=reshape(sst2,1,3402);
  22. end
  23. %标准化
  24. sst4=zeros(3402,415);
  25. for i=1:12;
  26.       sstn(:,i)=nanmean(sst3(:,i:12:end),2);
  27. end
  28. for j=1:3402;
  29.     for i=1:12
  30.         sst4(j,i:12:end)=(sst3(j,i:12:end)-sstn(j,i))/std(sst3(j,:));
  31.     end
  32. end
  33. %插值
  34. xi=40:2.5:120;
  35. yi=-20:2.5:20;
  36. x=40.1:1:120.1;
  37. y=-20.5:1:20.5;
  38. x=double(x);
  39. y=double(y);
  40. xi=double(xi);
  41. yi=double(yi);
  42. [XX,YY]=meshgrid(yi,xi);%想要变成的格式
  43. [X,Y]=meshgrid(y,x);
  44. for i=1:415;
  45.     U1(:,:,i)=griddata(XX,YY,U(:,:,i),X,Y,'v4');
  46. end;
  47. %将lon,lat化为一维
  48. for i=1:1:415;
  49.     U2=squeeze(U1(:,:,i));
  50.     U3(:,i)=reshape(U2,1,3402);
  51. end
  52. %标准化
  53. U4=zeros(3402,415);
  54. for i=1:12;
  55.       Un(:,i)=nanmean(U3(:,i:12:end),2);
  56. end
  57. for j=1:3402;
  58.     for i=1:12
  59.         U4(j,i:12:end)=(U3(j,i:12:end)-Un(j,i))/std(j,:);
  60.     end
  61. end
  62. SST_U=zeros(2,3402,415);
  63. SST_U(1,:,:)=sst4;
  64. SST_U(2,:,:)=U4;
  65. save  SST_U SST_U</font>
复制代码


2.2进行MV-EOF分解
  1. <font size="4"><p><font size="5">clc
  2. clear
  3. close all;
  4. load SST_U.mat

  5. for i=1:1:415
  6.     SST_U1=squeeze(SST_U(:,:,i));
  7.     SST_U2(:,i)=reshape(SST_U1,1,6804);
  8. end
  9. SST_U2(SST_U2<-1000000)=0;
  10. SST_U_nan=isnan(SST_U2);
  11. i=0;
  12. for j=1:6804;
  13.     if sum(SST_U_nan(j,:))==0;
  14.         i=i+1;
  15.         SST_U3(i,:)=SST_U2(j,:);
  16.     end
  17. end
  18. X=zeros(6804,415);                             
  19. for j=1:1:6804
  20.     for i=1:1:12
  21.     y(j,i)=mean(SST_U3(j,i:12:end));
  22.     X(j,i:12:end)=SST_U3(j,i:12:end) - y(j,i);
  23.    end
  24. end
  25. %EOF分解
  26. S=X'*X;
  27. [v,d]=eig(S);
  28. v=fliplr(v);                                           % 矩阵作左右翻转
  29. d=rot90(d,2);                                          % 矩阵上下翻转后再左右翻转(查看生成的对角阵是由小到大排列的~此指令可使其由大到小排列~fliplr(flipud(d))=rot90(d,2))
  30. diagonal=diag(d);                                      %d为特征跟%diag(v,k)以向量v的元素作为矩阵X的第k条对角线元素,当k=0时,v为X的主对角线;当k>0时,v为上方第k条对角线;当k<0时,v为下方第k条对角线。
  31. LR=X*v;                                                %LR为时间系数矩阵
  32. for i=1:1:415;
  33.     LR(:,i)=LR(:,i)/sqrt(diagonal(i));
  34. end
  35. Ym=LR'*X;%时间系数

  36. sum_d=sum(diagonal);
  37. for i=1:415;
  38.     G(i)=diagonal(i)/sum_d;                           % G2(i)是方差贡献率
  39. end
  40. SST_U_L=zeros(6804,415);
  41. SST_U_L(:,:)=NaN;
  42. i=1;
  43. for j=1:6804;
  44.    if sum(SST_U_nan(j,:))==0;
  45.       SST_U_L(j,:)=LR(i,:);%空间系数
  46.       i=i+1;
  47.    end
  48. end
  49. %将空间模态分开两个变量,只考虑第一模态
  50. K=reshape(SST_U_L(:,1),2,3402);</font></p><p><font size="5"> KK=reshape(K(1,:),81,42);
  51. KK2=reshape(K(2,:),81,42);
  52. %参考PPT的分解是下面的
  53. eSST=SST_U_L(1:3402,:);
  54. eU=SST_U_L(3403:end);
  55. %将经纬度分开
  56. eeSST=reshape(eSST(:,1),81,42);
  57. save SST_U_L SST_U_L</font>
复制代码
3,结果讨论
只画了第一模态的图
图1是按PPT方法画出来的
图2,3是我自己想的
结果和周磊老师分析的差别非常大,不知道是什么原因
希望有人可以给看看
周磊老师的图也在附件中













QQ1.png
QQ2.png
QQ3.png
图一,PPT做饭的空间场.jpg

图2,第一模态空间

图2,第一模态空间

图3

图3
周磊.png

SST_U.m

1.6 KB, 下载次数: 28, 下载积分: 金钱 -5

EOFSST_U.m

3.05 KB, 下载次数: 39, 下载积分: 金钱 -5

MV_EOF.pdf

1.94 MB, 下载次数: 135, 下载积分: 金钱 -5

评分

参与人数 2金钱 +40 贡献 +1 收起 理由
包了个租 + 20 淡定
夏夜 + 20 + 1 神马都是浮云

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-4-16 22:13:33 | 显示全部楼层
忘了说我编程超级烂,没正统学过什么编程原理,所以程序看起来可能有点乱,我尽量把重要步骤做了备注。。。希望有人能给看看
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-16 22:14:41 | 显示全部楼层
谢谢,学习了,赞一个
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-16 22:25:16 | 显示全部楼层
学习了,哈哈
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-16 22:25:23 | 显示全部楼层
学习了,哈哈
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-20 07:47:39 | 显示全部楼层
谢谢,学习了,赞一个
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-4-20 18:07:10 | 显示全部楼层
这个不错,学习下哈!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-8-30 10:23:22 | 显示全部楼层
楼主的图贴的有点乱呢,前三个图的title都一样,怎么pattern差这么多?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-9-17 20:23:37 | 显示全部楼层
谢谢分享,楼主好人
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-11-30 16:47:50 | 显示全部楼层
楼主讲得挺不错的
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表