我有一个NetCDF文件,其中包含表示全球几个月内总降水量的数据(因此它存储在三维数组中)。我首先确保数据是合理的,以及它在XConv和ncdump中的形成方式。所有看起来都是合理的 - 值从非常小(~10 ^ -10 - 这是有意义的,因为这是模型数据,并且实际上表示为零)到大约5x10 ^ -3。
当我尝试在IDL或MatLab中处理此数据时,问题就开始了。在这些程序中生成的数组充满了巨大的负数,例如-4x10 ^ 4,偶尔会出现巨大的正数,例如5000.奇怪的是,在MatLab中查看关于纬度和经度的数据图(在特定情况下)时间),降雨模式看起来很合理,但价值观完全错误。
在IDL中,我正在读取文件以将其写入文本文件,因此可以通过一些采用非常基本的文本文件的软件来处理。这是我正在使用的代码:
PRO nao_heaps
address = '/Users/levyadmin/Downloads/'
file_base = 'output'
ncid = ncdf_open(address + file_base + '.nc')
MONTHS=['january','february','march','april','may','june','july','august','september','october','november','december']
varid_field = ncdf_varid(ncid, "tp")
varid_lon = ncdf_varid(ncid, "longitude")
varid_lat = ncdf_varid(ncid, "latitude")
varid_time = ncdf_varid(ncid, "time")
ncdf_varget,ncid, varid_field, total_precip
ncdf_varget,ncid, varid_lat, lats
ncdf_varget,ncid, varid_lon, lons
ncdf_varget,ncid, varid_time, time
ncdf_close,ncid
lats = reform(lats)
lons = reform(lons)
time = reform(time)
total_precip = reform(total_precip)
total_precip = total_precip*1000. ;put in mm
noLats=(size(lats))(1)
noLons=(size(lons))(1)
noMonths=(size(time))(1)
; the data may not be an integer number of years (otherwise we could make this next loop cleaner)
av_precip=fltarr(noLons,noLats,12)
for month=0, 11 do begin
year = 0
while ( (year*12) + month lt noMonths ) do begin
av_precip(*,*,month) = av_precip(*,*,month) + total_precip(*,*, (year*12)+month )
year++
endwhile
av_precip(*,*,month) = av_precip(*,*,month)/year
endfor
fname = address + file_base + '.dat'
OPENW,1,fname
PRINTF,1,'longitude'
PRINTF,1,lons
PRINTF,1,'latitude'
PRINTF,1,lats
for month=0,11 do begin
PRINTF,1,MONTHS(month)
PRINTF,1,av_precip(*,*,month)
endfor
CLOSE,1
END
任何人都有任何想法,为什么我在MatLab 和 IDL中得到如此奇怪的值?!
答案 0 :(得分:1)
AH!找到了答案。 NetCDF文件使用偏移量和数据的比例因子来使文件的大小保持最小。要获得正确的值,我只需要:
total_precip = offset + (scale_factor * total_precip) ;put into correct range
目前我正在从ncdump获得比例因子和偏移量,并将它们硬编码到我的IDL程序中,但有没有人知道如何在我的IDL代码中动态获取它们??