爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 26481|回复: 31

[讨论] 【已解决】讨论格点数据的EOF和SVD如何做?

[复制链接]
发表于 2015-8-7 20:21:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 kongfeng0824 于 2015-8-9 17:00 编辑

气象家园中已经有很多帖子是做EOF和SVD分析的,但是大都是针对站点数据的。不知道大家对格点数据是如何进行EOF和SVD分析的?
一般的nc数据都是格点的,例如降水的nc数据中有lon,lat,time三维。
针对这三维的矩阵做EOF分析,感觉是要对矩阵进行转置的。
不知道大家在处理格点数据的EOF分析时是如何进行的?


我的解决办法:采用时空转换

clc;
clear;
load('CAPE19792014.mat');
baoyuliang=reshape(SQ19792014,[241*480,36]);
juping=baoyuliang-mean(baoyuliang,2)*ones(1,36);
xdata=juping;

% EOF Analysis
[EOFdata,E]=eig(xdata'*xdata);
EOFdata=fliplr(EOFdata); % 特征向量
E=fliplr(flipud(E)); % 特征根
PC=xdata*EOFdata;
diagonal=diag(E);
sum_d=sum(diagonal);                 % 总的特征值

EOF1=PC(:,1)/sqrt(E(1,1)); % xdata*xdata’的第一特征向量
EOF1=reshape(EOF1,[241,480]);
e1=(diagonal(1,1)/sum_d)*100 %;       %38.2920%
PC1=PC(1,:);


EOF2=PC(:,2)/sqrt(E(2,2)); % xdata*xdata’的第二特征向量
EOF2=reshape(EOF2,[241,480]);
e2=(diagonal(2,1)/sum_d)*100 %;       %9.2266%
PC2=PC(2,:);


EOF3=PC(:,3)/sqrt(E(3,3)); % xdata*xdata’的第三特征向量
EOF3=reshape(EOF3,[241,480]);
e3=(diagonal(3,1)/sum_d)*100 %;       %9.1010%
PC3=PC(3,:);



来自群组: 北京师范大学地学-气象
密码修改失败请联系微信:mofangbao
发表于 2015-8-7 21:03:16 | 显示全部楼层
那个站点和格点的都能用
密码修改失败请联系微信:mofangbao
发表于 2015-8-8 00:31:28 | 显示全部楼层
我处理的时候是采用 reshape(U, lon*lat,time) 转换,其中U的维数是lon*lat*time三维,分析之后再对特征向量用reshape转换
密码修改失败请联系微信:mofangbao
发表于 2015-8-8 11:48:17 | 显示全部楼层
新手学习
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

发表于 2015-8-8 14:39:02 | 显示全部楼层
把经度纬度合为一维,然后做EOF就行了,就是转成资料矩阵就是了,看一下气象统计的教材就知道了
密码修改失败请联系微信:mofangbao
发表于 2015-8-8 16:01:28 | 显示全部楼层
nc数据的话用ncl直接可以出图的,特别容易
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2015-8-9 12:55:07 | 显示全部楼层
river 发表于 2015-8-7 21:03
那个站点和格点的都能用

不太明白。家园里面的程序都是针对站点数据的
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2015-8-9 12:58:13 | 显示全部楼层
Aires 发表于 2015-8-8 14:39
把经度纬度合为一维,然后做EOF就行了,就是转成资料矩阵就是了,看一下气象统计的教材就知道了

哦。小A版主的意思是将所有的格点数据转成二维数组,然后eof分析,再转回去。不知我的理解是不是对?
密码修改失败请联系微信:mofangbao
 楼主| 发表于 2015-8-9 13:41:35 | 显示全部楼层
Aires 发表于 2015-8-8 14:39
把经度纬度合为一维,然后做EOF就行了,就是转成资料矩阵就是了,看一下气象统计的教材就知道了

我根据你的建议作了如下处理:
clc;
clear;
SQ19792014=load('CAPE19792014.mat');
baoyuliang=reshape(SQ19792014,[241*480,36]);
juping=baoyuliang-mean(baoyuliang,2)*ones(1,36);

% EOF Analysis
xdata=juping;
[EOFs,expl,PCs]=eof(xdata);

结果出现如下:
Requested 115680x115680 (99.7GB) array exceeds maximum array size preference.
Creation of arrays greater than this limit may take a long time and cause MATLAB
to become unresponsive. See array size limit or preference panel for more
information.

Error in eof (line 11)
C=xm*xm'/N;

我感觉应该是格点太多。只有36年的数据,却又241*480个格点。不知道你是否遇到过这样的问题?怎么处理的?是不是需要对其中的格点抽样取点?
密码修改失败请联系微信:mofangbao
发表于 2015-8-9 15:47:01 | 显示全部楼层
kongfeng0824 发表于 2015-8-9 13:41
我根据你的建议作了如下处理:
clc;
clear;

这种情况下做时空转换,你给看一下气象统计的教材,这样只用求36*36的矩阵了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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