将数组传递给子程序IDL

时间:2016-06-06 20:17:57

标签: arrays multidimensional-array idl-programming-language

我有一个非常长的查找表(~40,000行),我用于我的代码。目前,我已经设置为从我的查找表中使用它的子程序中获取4个数组,但是我将该子程序称为~3,000次。我宁愿不浪费处理时间将这个表重复地作为数组。有没有办法在我的主程序中抓取它们,存储它们,然后在我的子程序中找到它们?

我当前的代码在4个独立的39,760行数组中抓取查找表,我现在称之为:

READCOL, 'LookupTable2.txt', F='D,D,D,D',Albedo, Inertia, NightT, DayT

编辑:我应该注意到我有IDL 6.2,但是如果有一种方法可以在更新的版本中进行,我仍然会很高兴知道如何。

编辑2:我当前的程序有一个函数可以保存4个数组并执行主函数。我可以用数组作为参数调用我的函数吗?这样我就不必继续创建相同的数组

类似的东西:

Pro
  FUNC(Array1, Array2, Var1, Var2, Var3)
END

1 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点。

看起来你有四列和40,000行,对吗?

然后你可以做以下事情。首先,我假设ASCII文件中没有用于以下命令的标题数据。

FUNCTION read_my_file,file_name

;;  Assume FILE_NAME is full path to and including file name with extension
fname = file_name[0]
;;  One could also find the file with the following
;;    fname = FILE_SEARCH([path to file],[file name with extension])

;;  Define the number of lines in the file
nl = FILE_LINES(fname[0])
;;  Define empty arrays to fill
col1 = DBLARR(nl[0])
col2 = DBLARR(nl[0])
col3 = DBLARR(nl[0])
col4 = DBLARR(nl[0])
dumb = DBLARR(4)
;;  Open file
OPENR,gunit,fname[0],ERROR=err,/GET_LUN
IF (err NE 0) THEN PRINT, -2, !ERROR_STATE.MSG   ;;  Prints an error message
FOR n=0L, nl[0] - 1L DO BEGIN
  ;;  Read in file data
  READF,gunit,FORMAT='(4d)',dumb
  ;;  Fill arrays
  col1[n] = dumb[0]
  col2[n] = dumb[1]
  col3[n] = dumb[2]
  col4[n] = dumb[3]
ENDFOR
;;  Close file
FREE_LUN,gunit
;;  Define output
output = [[col1],[col2],[col3],[col4]]

;;  Return to calling routine
RETURN,output
END

请注意,如果为format语句提供显式宽度,例如'(4d15.5),这意味着15个字符的输入,带有5个小数位,这将更好。

这会将col1通过col4返回给用户或调用例程作为[N,4]元素数组,例如col1 = output[*,0]。您可以使用一个结构,其中每个标记都包含一个colj数组,或者您可以通过keywords返回它们。

然后您可以通过以下方式将这些数组传递给另一个函数/程序:

PRO my_algorithm_wrapper,file_name,RESULTS=results
;;  Get data from files
columns = read_my_file(file_name)
;;  Pass data to [algorithm] function
results = my_algorithm(columns[*,0],columns[*,1],columns[*,2],columns[*,3])
;;  Return to user
RETURN
END

要从命令行调用它(在确保编译两个例程之后),您将执行以下操作:

IDL> my_algorithm_wrapper,file_name,RESULTS=results
IDL> HELP,results    ;;  see what the function my_algorithm.pro returned

以上代码适用于IDL 6.2。

一般说明

  1. 尽量避免在IDL例程名称中使用大写字母,因为当IDL在调用或编译语句中搜索例程时,它可能会导致问题。
  2. 您需要在文件开头的PRO / FUNCTION语句的行中命名程序/函数。该名称必须在PRO / FUNCTION声明后立即显示。
  3. 通常明智的做法是使用显式格式化语句来避免在读取数据文件时出现歧义/错误。
  4. 您可以将任何变量类型(例如,标量整数,数组,结构,对象等)传递给程序/函数,只要它们在程序/函数中得到适当处理即可。