【问题标题】:Netcdf fillvalue in MATLABMATLAB中的Netcdf填充值
【发布时间】:2013-06-29 16:42:26
【问题描述】:

我在 MATLAB 中使用一个相当大的 netcdf 文件,其中包含以下变量:

    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 将以双精度写入“数据”,否则将写入 int16。如果“数据”是双精度,则等于“_FillValue”值的值将转换为 NaN,而如果“数据”在 int16 中,则相同的单元格现在将包含值 -9999。为什么是这样? -1e+004在int16的范围内,为什么MATLAB写成-9999,而不是-10000?

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

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

【问题讨论】:

  • " 否则它将被写入 int16" - 您是否通过 WHOS 或 CLASS 呼叫与班级确认?如果存在 _FillValue 或 scale_factor,我相信它应该始终是 double 类型。如果您想要原始数据,可以考虑使用低级别(netcdf.* 函数)。
  • 是的,超过一定大小的提取被写入 int16。至少在使用 ncread 时。低级函数如何处理这个?

标签: matlab netcdf


【解决方案1】:

我相信填充值实际上是 -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

【讨论】:

  • 我有点困惑。通过互联网查看各种文档,我猜“填充值”的意思是:给定元素的缺失值或默认分配值没有被“传入”数据[值]覆盖,但仍然不确定。你能确认或否认这一点吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多