2015-04-23 12 views
0

雖然我確信有答案,而且這個問題很低級(但總是容易讓事情發生),我的主要問題是試圖提出問題。通過對陣列中的點進行平均來減小陣列的大小(IDL)

說我有以下的數組:

time=[0,1,2,3,4,5,6,7,8,9,10,11] ;in seconds 
data=[0,1,2,3,4,5,6,7,8,9,10,11] 

的「時間」陣列處於「1」的二進制位,而是我想陣列是在「2S」的二進制位,其中數據是那麼意思是:

time=[0,2,4,6,8,10] ;in seconds 
data=[0.5,2.5,4.5,6.5,8.5,10.5] 

是否存在(並且我確定存在)IDL函數在IDL中實現這一點? 我的實際數據數組是:

DATA   DOUBLE = Array[15286473] 

所以我寧願使用現有的,有效的解決辦法不是不必要地創造我自己的。

乾杯, 保羅

NB:我可以通過插值的數據(INTERPOL)

IDL> x=[0,1,2,3,4,5,6,7,8,9,10] 
IDL> x_new=interpol(x,(n_elements(x)/2)+1.) 
IDL> print, x_new       
     0.00000  2.00000  4.00000  6.00000  8.00000  10.0000 

問題只是與數據陣列

回答

1

我想你需要rebinhttp://www.exelisvis.com/docs/REBIN.html

congrid提供類似的功能。如果rebin沒有解決您的問題,這應該工作:

step = 2 
select = step * indgen(floor(n_elements/step)) 
new_time = (smooth(time, step))[select] 
new_data = (smooth(data, step))[select] 

您可能需要設置/ edge_truncate平穩,根據您的要求。另外,不會刑警爲你工作?

+0

我發現國際刑警組織對時間陣列很好 - 因爲那裏我只需要在每個第二點的時間: IDL> x = [0,1,2,3,4,5,6,7,8, 9,10] IDL> x_new = interpol(x,(n_elements(x)/ 2)+1。) IDL> print,x_new 0.00000 2.00000 4.00000 6.00000 8.00000 10。0000 但無法看到它將如何工作的數據將是平均水平。 我會檢查出rebin!我最終編寫了類似於你的代碼,但總是很高興知道IDL未來的例程。 –

+0

@PaulWright如果它幫助你,請將此標記爲接受的答案:) – VBB

0

更改時間數組我想要什麼我可以想到幾種方法來做到這一點,但最簡單的方法如下:

nd = N_ELEMENTS(data) 
ind = LINDGEN(nd) 
upi = ind[1:(nd - 1L):2] 
dni = ind[0:(nd - 1L):2] 

其中我使用的索引的形式描述爲here。可以編寫數組ind[s0:s1:n],其中s0是起始元素,s1是結束元素,而n跨步。現在,我們已經爲adjecent元素的索引

,那麼我們就可以在矢量格式定義的平均值爲:

avg_data = (data[upi] + [dni])/2 

你可以做同樣的事情到您的時間戳或使用INTERPOL如果你想。

這樣做有更復雜的方法(例如trapezoid rule),但以上是一個快速簡單的解決方案。