我正在尝试编写一个循环来处理一个月的每日数据。我的代码每次手动执行1天时都有效,但是当我尝试遍历每月的每一天时,关于我的循环的某些操作就会失败。
基本上,我要遍历n = 1,30天以读取文件,将数据剪切到我的学习区域,并将每一天的数据添加到我的数据数组中。我想要一个包含整个月数据的数组。
这些是我循环中的函数:
@ mls_choosefile_co.pro->这只是给我'ToOpen'文件路径和名称
@ mls_readin_co.pro->使用file_id读取CO数据并将其裁剪到我的学习区域。输出为'co_sa_100',对于研究区域中100 hpa处的CO,1x700阵列(长度每天变化,可能是706、720、680 ...)
^^两者都可以正常工作。
; make array of data for the whole month - CO at 100hpa
; to append each additional day to this on each loop iteration
co_100_all = [ ]
; make array to save how many data points per day. use -9 as a fill value to tell me when the loop has not gone over that day.
len = MAKE_ARRAY(1,ndays, VALUE = -9)
; the loop in question:
FOR n = 0,ndays DO BEGIN &$
@mls_choosefile_co.pro &$
file_id = H5F_OPEN(ToOpen) &$
@mls_readin_co.pro &$
len[n-1] = N_ELEMENTS(co_sa_100) &$
co_100_all = [[co_100_all], [co_sa_100]] &$
END
我将'len'变量设置为测试。这将告诉我每天读取了多少数据点,每天的值(通常为700)。我将-9设置为循环未运行的填充值。它应显示为: len = [702,716,706]。 但是它只保存循环中的最后一个索引,我得到: len = [-9,-9,706]。
谢谢!
答案 0 :(得分:1)
更新:已修复!
我的问题是使用@program.pro
而不是program, input, output
格式调用函数。
循环n
天,提取名为'tracer'
的化学物质的数据,并将每天的output
保存到saveoutputs
数组中。
以下是经过编辑的代码,以防万一:
FOR n = 0, ndays-1 DO BEGIN
mls_choosefile, n, tracer, file_id
mls_readin, file_id, tracer, output
mls_len[n-1] = N_ELEMENTS(output)
saveoutputs[n,*] = output
END
将mls_choosefile
和mls_readin
设置为IDL过程。
答案 1 :(得分:0)
我认为您的循环应如下所示:
FOR n = 0,ndays DO BEGIN
@mls_choosefile_co.pro
file_id = H5F_OPEN(ToOpen)
@mls_readin_co.pro
len[n-1] = N_ELEMENTS(co_sa_100)
co_100_all = [[co_100_all], [co_sa_100]] &$
H5F_CLOSE, file_id
END
否则,我怀疑您正在@....pro
调用的脚本在循环的每次迭代期间都写入同一文件。我假设ToOpen
在每次迭代期间也会更改,以创建不同的输出文件。
通常,我建议从.pro文件中调用函数或过程,而不要使用@....pro
。这样会使代码更具可读性。
答案 2 :(得分:0)
我的 IDL 代码也有类似的问题。我的变量“m”在数组中有 ~17700 个数据点,当我 >print,m 或 >plot m,a 时……只有最后一个点被打印或绘制。
所以我尝试的替代方法是使用“追加”将数据点保存在 .dat 文件中,然后绘制它。
openu,1,'m.dat',/append printf,1,m free_lun,1
plot,m,a,yrange=1,6.2],xstyle=1,ystyle=1,xtitle='Magnetic Local Time',ytitle='Voltage [volts]',position=[0.06, 0.10, 0.97, 0.95]
这对我有用。关键是使用“追加”功能。