我被赋予了将一段MATLAB代码翻译成IDL的任务 当我遇到MATLAB函数accumarry()时遇到障碍。该 功能,描述here 用于根据另一个数组中给出的索引对一个数组中的元素求和。例 1或许比顶部的实际功能描述更好地解释了这一点 的页面。在尝试在IDL中重现示例1时,我无法避免for循环,但我相信它是可能的。我最好的尝试如下:
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 :(得分:0)
我在Coyote的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