爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
楼主: 恦之兰泽

[源程序] matlab。站点数据中有nan怎么进行eof分析中的运算

[复制链接]

新浪微博达人勋

 楼主| 发表于 2021-4-8 23:14:32 | 显示全部楼层
恦之兰泽 发表于 2021-4-8 23:10
写循环我也没搞出来

S=xlsread('E:\xinan\data3.xlsx');

avg = nanmean(S,1);%平均

for i=1:42
    for j=1:301
        if ~isnan(S(i,j))
          jupin = S(i,j)-avg(j);
        end
    end
end

算出来距平只有一个值
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-4-9 01:08:33 来自手机 | 显示全部楼层
恦之兰泽 发表于 2021-04-08 23:14
S=xlsread('E:\xinan\data3.xlsx');

avg = nanmean(S,1);%平均

for i=1:42
    for j=1:301
        if ~isnan(S(i,j))
          jupin = S(i,j)-avg(j);
        end
    end
end

算出来距平只有一个值

jupin(i,j)=.....,距平也是一个矩阵
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-4-9 10:18:39 | 显示全部楼层
angetina 发表于 2021-4-9 01:08
jupin(i,j)=.....,距平也是一个矩阵

大佬,如果你有空的话,麻烦帮我看看,今天搞不出来我就要延毕了,呜呜呜
  1. clear;clc;
  2. S=xlsread('E:\xinan\data(缺测为NaN).xlsx');
  3. S=S';
  4. avg = nanmean(S,1);%平均
  5. jup = zeros(42,301);
  6. for i=1:42;
  7.     for j=1:301
  8.         if ~isnan(S(i,j))
  9.             jup=S(i,j)-avg(j);
  10.         end
  11.     end
  12. end
复制代码
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-4-9 11:35:11 | 显示全部楼层
没搞懂楼主什么意思。S(有nan值)-非nan值,得出来的新矩阵就是这样呀:S中nan的地方依然是nan值,就好像nan-1=nan一样。楼主是想在距平矩阵中滤掉nan值吗?比如距平数组共10个元素,其中包含2个nan值,是想滤掉nan值得到新的数组,新数组包含8个非nan的元素?
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-4-9 11:38:13 | 显示全部楼层
croton 发表于 2021-4-9 11:35
没搞懂楼主什么意思。S(有nan值)-非nan值,得出来的新矩阵就是这样呀:S中nan的地方依然是nan值,就好像n ...

ta应该是想把eof结果求出来并且误差小一点
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-4-10 10:21:00 | 显示全部楼层
croton 发表于 2021-4-9 11:35
没搞懂楼主什么意思。S(有nan值)-非nan值,得出来的新矩阵就是这样呀:S中nan的地方依然是nan值,就好像n ...

   不好意思啊,是我没表达清楚。您疑惑的地方也正是我疑惑的地方。我是要对多年多个站点的降水做eof分析,可是因为有缺测,算出来的时间本征函数和空间本征函数会有许多缺测值,也就是时间序列和eof空间分布数据就会有缺测,画出来的图就不完整。我请教一个学长,他说可以用matlab处理出来没有缺测值的时间序列和eof空间分布数据。我也在网上查看了,对于有缺测的数据运算,像求平均、和、协方差,都可以用 nanmean()、nansum()、nancov() 这样得出没有缺测值的数据。对于数据矩阵的加减乘除如果有缺测,得出来的数据还是有缺测。我就搞不懂学长是怎么处理成没有缺测的。可能是我eof方法用的不对?不过最后我用了学长处理好的画完了图。
附上我eof的程序
  1. clear;clc;
  2. S=xlsread('E:\xinan\data(缺测为NaN).xlsx');     % 导入数据301*42
  3. %S = ncread('E:\swc.nc','rstrength');
  4. S=S';                                            % 转置
  5. X=S-repmat(nanmean(S,1),42,1);                   % 时间距平
  6. R=nancov(S') ;                                   % 协方差矩阵R=X*X'
  7. [v,d]=eig(R);                                    % 进行EOF分解~因为X'*X与X*X'的秩相同所以特征值相同~d为x的特征值组成的对角阵~v为X*X'的特征向量~
  8. v=fliplr(v);                                     % 矩阵作左右翻转
  9. d=rot90(d,2);                                    % 矩阵上下翻转后再左右翻转(查看生成的对角阵是由小到大排列的~此指令可使其由大到小排列~fliplr(flipud(d))=rot90(d,2))
  10. diagonal=diag(d);                                % d是特征值的对角矩阵,v是特征向量

  11. spacef=X'*v;                                     % spacef是主成分  

  12. for i=1:42;
  13.     spacef(:,i)=spacef(:,i)/sqrt(diagonal(i));   % 空间本征函数
  14. end

  15. timef=X*spacef;                                  % 时间本征函数
  16. sum_d=sum(diagonal);
  17. count=0;
  18. for i=1:42;
  19.     count=count+diagonal(i);           
  20.     G1(i)=count/sum_d;                           % G1(i)是累积方差贡献率
  21. end
  22. for i=1:42;
  23.     G2(i)=diagonal(i)/sum_d;                     % G2(i)是方差贡献率
  24. end

  25. figure(1)   %第一模态图
  26. x=1979:2020;
  27. plot(x,timef(:,1),'b-','linewidth',1.5);
  28. axis([min(x),max(x),min(timef(:,1)),max(timef(:,1))]);
  29. %,'MarkerEdgeColor','b','MarkerFaceColor','b','MarkerSize',3
  30. xlabel('t (year)','FontName','TimesNewRoman','FontSize',12);
  31. ylabel('INDEX','fontsize',12,'fontname','宋体')
  32. % set(gca ,'xtick',(1:6:42))
  33. % set(gca,'xticklabel',{'1979','1985','1991','1997','2003','2009','2015','2020'})
  34. title('第1模态时间序列', 'color', 'k','fontsize',15,'fontname','宋体')
  35. %hold off
  36. %saveas(gcf,'1979-2020年雨季降水第1模态时间序列','jpg');

  37. figure(2)   %第二模态图
  38. x=1979:2020;
  39. plot(x,timef(:,2),'b-','linewidth',1.5);
  40. axis([min(x),max(x),min(timef(:,2)),max(timef(:,2))]);
  41. %,'MarkerEdgeColor','b','MarkerFaceColor','b','MarkerSize',3
  42. xlabel('t (year)','FontName','TimesNewRoman','FontSize',12);
  43. ylabel('INDEX','fontsize',12,'fontname','宋体')
  44. % set(gca ,'xtick',(1:6:42))
  45. % set(gca,'xticklabel',{'1979','1985','1991','1997','2003','2009','2015','2020'})
  46. title('第2模态时间序列', 'color', 'k','fontsize',15,'fontname','宋体')
复制代码
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-4-10 10:23:30 | 显示全部楼层
恦之兰泽 发表于 2021-4-10 10:21
不好意思啊,是我没表达清楚。您疑惑的地方也正是我疑惑的地方。我是要对多年多个站点的降水做eof分析 ...

欢迎知道的大佬来解答
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 成长值: 32430
发表于 2021-4-11 15:24:41 | 显示全部楼层
mltoolbox工具箱可以试试,本版置顶就有
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-10-12 18:12:49 | 显示全部楼层
请问楼主有没有对eof结果进行显著性检验呀
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2021-10-19 10:41:33 | 显示全部楼层
可以用缺测值,直接将nan数据直接删除,后续结果再降删除的nan恢复进空间模态中。
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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