У меня есть файл 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?!