0

MATLAB コードの一部を IDL に変換するタスクを与えられましたが、MATLAB 関数 accumarry() に出くわしたときに障害にぶつかりました。ここで説明する関数は 、別の配列で指定されたインデックスに基づいて、ある配列の要素を合計するために使用されます。例 1 は、ページの上部にある実際の関数の説明よりも、おそらくこれをよりよく説明しています。例 1 を IDL で再現しようとしても、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 にも同様の組み込み関数があると予想していましたが、追跡できませんでした。おそらく、ヒストグラムのビニングによる魔法でしょうか?

4

1 に答える 1

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
于 2013-06-03T11:03:07.717 に答える