我已經在IDL中編寫了一個程序,它對數據執行一些計算並輸出一組值。計算需要大約2分鐘的時間。
然後我需要對這些結果進行分析,理想情況下,我不希望每次執行一些不同的分析時都要執行初始計算。IDL程序中的多個程序
實現此目的的最佳方法是將計算輸出保存到數據文件中,然後從不同的程序中讀取它?還是有一個不那麼麻煩的方式去做這件事?
預先感謝任何幫助
我已經在IDL中編寫了一個程序,它對數據執行一些計算並輸出一組值。計算需要大約2分鐘的時間。
然後我需要對這些結果進行分析,理想情況下,我不希望每次執行一些不同的分析時都要執行初始計算。IDL程序中的多個程序
實現此目的的最佳方法是將計算輸出保存到數據文件中,然後從不同的程序中讀取它?還是有一個不那麼麻煩的方式去做這件事?
預先感謝任何幫助
是的,保存到文件是保存第一個程序的結果以便稍後在第二個程序中使用的最簡單方法(假設您在兩者之間退出了IDL)。有幾種方法可以保存數據,具體取決於它的類型和偏好。
最簡單的方法:由SAVE
命令創建可以存儲任何類型的數據,IDL變量
的IDL文件名爲.sav,甚至你的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
來讀取。
最便攜的二進制格式:
對於複雜的數據需要由多國語言閱讀,考慮HDF5或NetCDF庫。這兩種都是二進制格式,可以存儲大多數類型的IDL支持的數據。請注意,NetCDF實際上是HDF5的一個易於使用的子集。
最簡單的二進制格式:
表格數據的另一個選項是一個簡單的二進制轉儲。使用WRITEU
寫入打開寫入的普通文件。使用READU
從普通文件讀取讀取。
假設你的數據進行計算,只會改變很少,那麼,是的,你最好的解決方法就是計算保存到一個輸出文件,然後讀取它們放回你的分析程序。你不會說這是什麼類型的數據,所以很難給出更具體的答案。假定有數據的二維陣列,則可以只寫的結果爲「平的」二進制文件:
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
希望這會有所幫助。
保存是一種很好的方法,但如果你在同一個會話中運行,而你的第二個程序不會搞亂第一個程序中的數據,那麼你可以調用一個,然後將結果傳遞給第二個一。
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
做壞事給他們。
您也可以設置第二個過程來檢查它是否具有來自第一個過程的有效結果並根據需要調用它。