爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 11157|回复: 27

[程序设计] 求助:matlab缺测值的处理

[复制链接]

新浪微博达人勋

发表于 2014-8-24 15:52:28 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 二爷名声在外 于 2014-8-24 15:57 编辑

各位大神:        小女子用noaa 的月平均海温资料sst.mean.nc时遇到了缺测值的问题,用matlab查看数据资料,显示缺测值标记为3.28e+04;下面是数据信息:

sst
           Size:       360x180x655
           Dimensions: lon,lat,time
           Datatype:   int16
           Attributes:
                       unpacked_valid_range = [-5.00e+00  4.00e+01]
                       actual_range         = [-2.80e+00  3.70e+01]
                       units                = 'degC'
                       precision            = 2
                       missing_value        = 3.28e+04
                       _FillValue           = 3.28e+04
                       long_name            = 'Sea Surface Temperature Monthly Mean at Surface'
                       dataset              = 'ICOADS 1-degree Enhanced'
                       var_desc             = 'Sea Surface Temperature'
                       level_desc           = 'Surface'
                       statistic            = 'Mean'
                       parent_stat          = 'Individual Obs'
                       add_offset           = 323
                       scale_factor         = 0.01
                       valid_range          = [-3.28e+04 -2.83e+04]
>>

       试图对数据中只要某点出现过一次缺测,那么则将该点所有时刻的数据都标记为NaN,但是运行发现并未将缺测值写为NAN,而是显示为32766,或者直接写成了0,这是为什么?(程序代码如下)
       (查找之前的帖子发现,赋值NaN好像应该写成n_sst(n_sst==3.28+e04)=NaN;但是尝试后所有缺测值都标记为0,不知道原因何在?)


% 处理缺测值
for p=1:100
    for q=1:40
        for t=1:648
            if n_sst(p,q,t)==3.28e+04||n_sst(p,q,t)==NaN %发现缺测值则标记为NaN
                n_sst(p,q,1:648)=NaN;
            else pass(p,q,t)=n_sst(p,q,t); %将有效数组赋给pass
            end
        end
    end
end


for p=1:100
    for q=1:40
         for t=1:648
        if n_sst(p,q,t)~=NaN           
            sst(p,q,t)=double(n_sst(p,q,t))*factor_sst+offset_sst      
        else r_havesst(p,q,1:638)=NaN;
        end
         end
       count=0;  
    end   
end



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

新浪微博达人勋

 成长值: 32430
发表于 2014-8-24 16:41:13 | 显示全部楼层
楼主可以考虑用find函数
密码修改失败请联系微信:mofangbao
回复 支持 0 反对 1

使用道具 举报

新浪微博达人勋

 成长值: 32430
发表于 2014-8-24 15:55:13 | 显示全部楼层
如果楼主方便的话把问题可以先放在qq群当中讨论一下。
qq群好吗可以参考置顶帖,谢谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 32430
发表于 2014-8-24 15:59:52 | 显示全部楼层
不知道楼主具体要得到什么数组
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-8-24 16:34:18 | 显示全部楼层
二爷名声在外 发表于 2014-8-24 15:59
不知道楼主具体要得到什么数组

我想要求sst的各月距平,上面粘贴的只是程序的一部分,我的问题在于如何将缺测的部分标记为NaN
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-25 08:37:14 | 显示全部楼层
判断一个变量x是否是NaN,用isnan(x)  而不是 x==NaN。将数组中的指定值设为NaN,可写为x(x==3.28e+04) = nan,其中x==3.28e+04为一个逻辑索引数组
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 32430
发表于 2014-8-25 08:52:22 | 显示全部楼层
飞云侠客 发表于 2014-8-25 08:37
判断一个变量x是否是NaN,用isnan(x)  而不是 x==NaN。将数组中的指定值设为NaN,可写为x(x==3.28e+04) = n ...

我感觉之前她描述的问题就是x(x==3.28e+04) = nan一句话就能解决的
但是看了她的程序貌似她不止是这么简单…
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-25 10:00:19 | 显示全部楼层
二爷名声在外 发表于 2014-8-25 08:52
我感觉之前她描述的问题就是x(x==3.28e+04) = nan一句话就能解决的
但是看了她的程序貌似她不止是这么简 ...

就这么简单 没问题的  Matlab尽量用非循环算法  不要用for循环
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 32430
发表于 2014-8-25 10:07:12 | 显示全部楼层
飞云侠客 发表于 2014-8-25 10:00
就这么简单 没问题的  Matlab尽量用非循环算法  不要用for循环

我的意思是她涉及到了多个数组…
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-8-25 12:42:03 | 显示全部楼层
n_sst(n_sst》10000)=nan;   这样写应该就可以了,而且不用写循环吧。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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