2013-07-02 90 views
0

我在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

回答

0

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