的netCDF fillvalue在MATLAB

问题描述:

我在MATLAB工作有相当大的netCDF文件,包含以下变量:的netCDF fillvalue在MATLAB

tg    
     Size:  272x214x23011 
     Dimensions: longitude,latitude,time 
     Datatype: int16 
     Attributes: 
        long_name  = 'mean temperature' 
        units   = 'Celsius' 
        standard_name = 'air_temperature' 
        _FillValue = -1e+004 
        scale_factor = 0.01 

我使用的ncread函数读取矩阵块,如:

data = ncread(netcdfFile,'tg',[1 1 1],[Inf Inf 10]); 

前10个时间步骤。如果有足够的内存并且'块'足够小,MATLAB将以双精度写入'data',否则它将写入int16。如果'data'是双精度的,那么等于'_FillValue'值的值将被转换为NaN,而如果'data'在int16中,相同的单元格现在将包含值-9999。为什么是这样? -1e + 004在int16的范围内,那为什么MATLAB把它写成-9999,而不是-10000?

这是因为int16(NaN)= 0,然后落在数据的范围内,此后MATLAB将默认填充值-9999应用于单元格?

有人可以解释发生了什么?

+0

“else it will written in int16” - 你是否用WHOS或CLASS调用来确认课程?我相信如果存在_FillValue或scale_factor,它总是应该是double类型的。如果您需要原始数据,您可以考虑使用低级别(netcdf。*函数)。 –

+0

是的,超过一定大小的提取被写入int16。至少在使用ncread时。低级函数如何处理这个问题? – simondk

我相信填充值实际上是-9999。 它是一个不幸的显示问题。

>> nccreate('/tmp/t.nc','p','FillValue',-9999) 
>> ncdisp /tmp/t.nc 
Source: 
      /tmp/t.nc 
Format: 
      netcdf4_classic 
Variables: 
    p 
      Size:  1x1 
      Dimensions: 
      Datatype: double 
      Attributes: 
         _FillValue = -1e+04 
+0

当然。谢谢你。 – simondk

+0

我有些困惑。通过互联网查看各种文档我猜“填充值”意味着:给定元素缺省值或默认分配值未被“传入”数据[值]覆盖,但仍不确定。你能否确认或否认这一点? – EpiGen