0

내 코드에 사용하는 매우 긴 조회 표 (~ 40,000 줄)가 있습니다. 현재, 그것을 사용하는 서브 루틴 내 조회 테이블에서 4 배열을 잡으려고 설정되어 있지만 그 서브 루틴 ~ 3000 번 호출합니다. 이 테이블을 배열로 반복적으로 가져 오는 처리 시간을 낭비하지 않을 것입니다. 내 메인 프로그램에서 그들을 잡아서 저장하고 나중에 내 서브 루틴에서 소스를 얻을 수있는 방법이 있습니까?배열을 서브 루틴 IDL로 전달

내 현재 코드는 39760 개 라인의 4 개 별도의 배열에서 조회 테이블을 잡고, 나는 현재이처럼 호출 오전 :

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 

답변

0

는이 작업을 수행 할 수있는 몇 가지 방법이 있습니다 : 그런 식으로 나는 같은 배열을 같은

뭔가를 만들어 계속해야하지 않을 것입니다.

네 개의 열과 40,000 줄이있는 것 같습니다. 맞습니까?

그런 다음 다음을 수행 할 수 있습니다. 먼저 다음 명령에 대한 ASCII 파일에 헤더 데이터가 없다고 가정합니다. 당신은, 예를 들어, 형식 문에 대한 명시적인 폭을 제공하는 경우이 5 소수 자릿수가 15 문자 입력을 의미하는, '(4d15.5)을 더 잘 작동합니다

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 

참고.

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. 프로그램/함수 내에서 적절하게 처리되는 한 모든 변수 유형 (예 : 스칼라 정수, 배열, 구조체, 객체 등)을 프로그램/함수에 전달할 수 있습니다.
+0

저는 IDL에 익숙하지 않고 C++에서 온 것처럼 다소 혼란 스럽습니다. 이것은 배열로 내 데이터를 호출하는 좋은 방법 인 것 같아요,하지만 난 그걸로 최선을 다하지 않을 수도 위의 코드 (내가 가진 것 같아요. 마지막 단락에서 fuction 호출에 배열을 포함 할 수 있다고 말하고 있습니까? 편집 : 원래 형식으로 게시 할 수 있습니다. – Cam

+0

@Cam - 예, IDL의 프로그램과 함수에서 /로 배열을 전달/반환 할 수 있습니다. 그러나 두 번째 업데이트 구문이 올바르지 않습니다. 임의 함수 FUNC의 출력을 정의해야합니다. –

+0

@Cam - IDL은 여러면에서 Fortran과 Python (기능적으로는 FOR, WHILE 등)과 유사합니다 (벡터화 된 언어이므로 루프가 매우 느립니다 ...) C++은 루프보다 훨씬 빠릅니다. IDL은 있지만 Fortran이나 Python이 신경 쓰면 손을 생각 나게하지 마십시오.) –