我的IDL循环仅保存上一次迭代-如何解决?

时间:2019-07-22 20:38:52

标签: idl

我正在尝试编写一个循环来处理一个月的每日数据。我的代码每次手动执行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]。

谢谢!

3 个答案:

答案 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_choosefilemls_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]

这对我有用。关键是使用“追加”功能。