Я работаю в 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 к ячейкам?

Может кто-нибудь объяснить, что происходит?

0
simondk 2 Июл 2013 в 14:41
"иначе это будет написано в int16" - вы подтвердили класс с вызовом WHOS или CLASS? Я считаю, что он всегда должен иметь тип double, если присутствует _FillValue или scale_factor. Вы можете рассмотреть возможность использования низкого уровня (функции netcdf. *), Если вам нужны необработанные данные.
 – 
Ashish Uthama
2 Июл 2013 в 16:24
Да, выдержки более определенного размера записываются в int16. По крайней мере, при использовании ncread. Как с этим справляются функции низкого уровня?
 – 
simondk
3 Июл 2013 в 10:49

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
0
Ashish Uthama 2 Июл 2013 в 16:27
Я немного запутался. Изучая различные документы через Интернет, я полагаю, что «значение заполнения» означает: отсутствующее значение для данного элемента или значение распределения по умолчанию, которое не было перезаписано «входящими» данными [значениями], но все еще не уверен. Могли бы вы это подтвердить или опровергнуть?
 – 
EpiGen
22 Фев 2016 в 03:36