IDL程序中的多个程序

时间:2015-02-17 20:33:31

标签: idl-programming-language

我在IDL中编写了一个程序,它对数据执行一些计算并输出一组值。计算大约需要2分钟 然后我需要对这些结果进行分析,理想情况下,我希望每次执行不同的分析时都不必执行初始计算。

实现此目的的最佳方法是将计算中的输出保存到数据文件中,然后从其他程序读取吗?或者有一个不那么繁琐的方法来解决这个问题?

提前感谢您提供任何帮助

3 个答案:

答案 0 :(得分:3)

是的,保存到文件是保存第一个程序结果以便以后在第二个程序中使用的最简单方法(假设您在两者之间退出IDL)。可能有多种方法可以保存数据,具体取决于数据的类型和偏好。

最简单的方法:

SAVE命令创建的IDL .sav文件可以存储任何类型的数据,IDL变量,甚至是IDL会话的整个状态。不幸的是,它只适用于IDL(没有其他语言),如果你升级IDL版本,它可能需要重新生成。您使用RESTORE读取这些文件,甚至可以记住变量的名称。

my_variable = 'Some data here.'

SAVE, my_variable, FILENAME='myfile.sav'  ; save variable(s)

... IDL opened and closed here ...

RESTORE, 'myfile.sav'                     ; read variable(s) from file

print, my_variable
Some data here.

最便携的方式:

对于简单的表格数据,CSV具有高度可移植性和人类可读性的优点。但是,它也很慢,因为数字以ASCII格式存储。使用WRITE_CSV撰写,READ_CSV阅读。

大多数便携式二进制格式:

对于需要多种语言阅读的复杂数据,请考虑HDF5NetCDF库。这两种都是二进制格式,可以存储大多数类型的IDL支持的数据。请注意,NetCDF实际上是一个易于使用的HDF5子集。

最简单的二进制格式:

表格数据的另一个选项是简单的二进制转储。使用WRITEU写入打开以进行写入的普通文件。使用READU从正常文件中读取以供阅读。

答案 1 :(得分:0)

假设您的数据计算只会很少变化,那么,是的,您最好的解决方案是将计算保存到输出文件,然后将它们读回您的分析程序。你没有说这是什么类型的数据,因此很难给出更具体的答案。假设您有一个二维数据数组,您可以将结果写为“平面”二进制文件:

pro perform_calculations
  ...
  ; assume mydata is a float array of dimensions [m,n]
  openw, 1, 'results.dat'
  writeu, 1, mydata
  close, 1
end

然后,在同一个文件中,或者最好是另一个.pro文件:

pro perform_analysis
  mydata = fltarr(m, n)
  openr, 1, 'results.dat'
  readu, 1, mydata
  close, 1
  ...
end

希望这有帮助。

答案 2 :(得分:0)

保存是一种很好的方法,但是如果你在同一个会话中运行而你的第二个程序不会搞乱第一个程序中的数据,你只需调用一个然后将结果传递给第二个程序

pro do_calculations,result1,result2,result3
    result1=1
    result2=1.
    result3=result1/result2
    return
end

pro use_calculations,result1,result2,result3,result4
    result4=result1-result2+result3
    return
end

然后

IDL> do_calculations,result1,result2,result3
IDL> use_calculations,result1,result2,result3,result4

如果您修改use_calculations,则可以再次执行以下操作:

IDL> use_calculations,result1,result2,result3,result4

因为早期的结果会留在内存中,除非use_calculations对他们造成不好的事情。

您还可以设置第二个程序,以检查第一个程序是否具有第一个程序的有效结果,并根据需要调用它。