2013-05-31 68 views
0

我已經被賦予了將一段MATLAB代碼翻譯爲IDL的任務,並且當我遇到MATLAB函數accumarry()時遇到了一個障礙( )。 here 的 函數用於根據另一箇中給出的索引來求和一個數組中的元素。示例 1可能比頁面頂部 處的實際功能說明更好地解釋了這一點。在嘗試重現IDL中的示例1時,我無法避免使用for循環,但我相信這是可能的。我最好的嘗試如下:IDL等價於MATLAB函數accumarray()

vals = [101,102,103,104,105] 
subs = [0,1,3,1,3] 

n = max(subs)+1 
accum = make_array(n) 

for i = 0, n-1 do begin 
    wVals = where(subs eq i,count) 
    accum[i] = count eq 0 ? 0 : total(vals[wVals]) 
endfor 

print,accum 
;  101.000  206.000  0.00000  208.000 

任何意見,以改善這將不勝感激!我預計IDL有一個類似的內置功能,但一直沒能跟蹤。也許一些魔術與直方圖裝箱?

回答

0

,我發現了一些關於狼的IDL網站,這個問題可能的解決方案 http://www.idlcoyote.com/code_tips/drizzling.html

我結束了使用以下,性能和可讀性之間的折衷(這並不奇怪。):

function accumarray,data,subs 

mx = max(subs) 
accum = fltarr(mx+1) 

h = histogram(subs,reverse_indices=ri,OMIN=om) 
for j=0L,n_elements(h)-1 do if ri[j+1] gt ri[j] then $ 
    accum[j+om] = total(vals[ri[ri[j]:ri[j+1]-1]]) 

return,accum