IDL 程序中的多个过程

Multiple procedures in IDL program

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

实现此目的的最佳方法是将计算的输出保存到数据文件中,然后从不同的程序中读取它吗?或者有没有更简单的方法来解决这个问题?

在此先感谢您的帮助

假设您的数据计算很少更改,那么,是的,您最好的解决方案是将计算保存到输出文件,然后将它们读回您的分析程序。你不说这是什么数据,所以很难给出更具体的答案。假设您有一个二维数据数组,您可以将结果写为 "flat" 二进制文件:

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

希望对您有所帮助。

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

最简单的方法:

一个由SAVE command can store any kind of data, IDL variables, and even the whole state of your IDL session. Unfortunately, it only works for IDL (no other languages), and it can need to be re-generated if you upgrade IDL version. You read these files with RESTORE创建的IDL .sav文件,它甚至可以记住变量的名称。

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 to write, and READ_CSV阅读。

最便携的二进制格式:

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

最简单的二进制格式:

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

保存是一个很好的方法,但是如果您 运行 在同一个会话中并且您的第二个程序不会弄乱第一个程序的数据,您可以只调用一个然后通过结果到第二个。

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对他们做了坏事。

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