MATLAB函数accumarray()的IDL等价物

MATLAB函数accumarray()的IDL等价物,matlab,idl-programming-language,Matlab,Idl Programming Language,我的任务是将一段MATLAB代码翻译成IDL,并且 遇到MATLAB函数AccuMary()时遇到了障碍。这个 功能,描述 用于根据另一个数组中给定的索引对一个数组中的元素求和。例子 1可能比顶部的实际功能描述更好地解释了这一点 这是本页的最后一页。在尝试用IDL重现示例1时,我无法避免for循环,但我相信这是可能的。我的最佳尝试如下: vals = [101,102,103,104,105] subs = [0,1,3,1,3] n = max(subs)+1 accum = make_ar

我的任务是将一段MATLAB代码翻译成IDL,并且 遇到MATLAB函数AccuMary()时遇到了障碍。这个 功能,描述 用于根据另一个数组中给定的索引对一个数组中的元素求和。例子 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有一个类似的内置函数,但一直没有找到。也许直方图装箱有点神奇?

我在Coyote的IDL站点上找到了许多可能的解决方案(这并不奇怪)

作为性能和可读性之间的折衷,我最终使用了以下内容:

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