Matlab関数accumarrayの使い方

2756 ワード

accumarrayという関数に出会ったのはSteveの文章[1]にある.
 
これは柔軟なbuild-in関数なので、mファイルがなく、実装コードが見えません.
 
最初は拗ねていて、例を見てどういう意味か分かりました.
 
MatlabのHelp[2]ではこう言います.
accumarray groups elements from a data set and applies a function to each group. A = accumarray(subs,val) creates an array A by accumulating elements of the vector val using the elements of subs as indices. The position of an element in subs determines which value of vals it selects for the accumulated vector; the value of an element in subs determines the position of the accumulated vector in the output.
A=accumarray(subs,val)という呼び出しに対して,このようないくつかの問題があり,理解し,この関数を理解した.
例:
val    =     [     1     2     3     4     5    ]
subs =     [     1     2     4     2     4    ]'  % subs     
  

Q:accumarrayは全体的に何をしていますか.
A:大まかに言えば、subsベクトルの情報でvalから数値を抽出して累積し、累積した結果をAに入れる.
 
Q:subsは何をしていますか.
A:subsは累積指示ベクトルです.
subsが提供する情報は2つあります.
(a). subsベクトルの各位置はvalの各位置に対応する.
(b). subsの要素の値は同じで、valの中の対応する要素は累積して、要素の値は累積した後にAのどこに置くのです.
例えば、上記の例では、subs(2)、subs(4)はいずれも2であるため、val(2)とval(4)が加算され、A(2)という位置に置かれる.
 
Q:valは何をしていますか.
A:valは加算値を提供していますが、誰が加算しますか.Aの数値加算です.どの数を加算しますか?subsベクトルにおける数値が同じ対応位置の数.累積したらどこに置きますか?subsで指示された位置に配置します.
 
Q:Aはどうやって出てきたのですか.Aの次元は何ですか.Aの内容はどのように確定しますか?
A:Aの次元はsubsで次元を表す数値が最も大きいもので、例ではsize(A,1)=4であり、max(subs)=4である.もちろん、これは1次元の状況にすぎません.
最後のAの結果は、
A=1%subs(1)=1であるため,A(1)=val(1)である.6%subs(2)=subs(4)=2であるため、A(2)=val(2)+val(4)0%subsには3の値がない、つまりA(3)には何の値も値%val(3)に対応するsubs(3)=4が加算されないので、val(3)はA(4)に8%subs(3)=subs(5)=4が加算されるので、A(4)=val(3)+val(5)
 
Steveではaccumarrayを用いて座標対児から位置を統計する機能を実現した.
pairs = [... 1 3; 1 2; 2 1; 2 4; 3 1; 3 4; 4 2; 4 3; 5 6; 5 7; 6 5; 6 8; 7 5; 7 8; 7 9; 8 6; 8 7; 8 10; 9 7; 9 10; 10 8; 10 9] A = accumarray(pairs, 1)結果:A=0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 
これはaccumarrayの柔軟な使い方です.
 
マトリクス内の重複しない数値を統計するのに非常に効率的に使用できます.rocwoodsの投稿[3]を参照してください.
 
遅すぎて、簡単に書くと、まだ多くの細部の問題が列挙されていない:2次元以上の次元の応用、sumのほかに自分で関数処理を定義することができるなど、大体の意味を知ってから、MatlabのHelp[2]をよく見ることができます.
References:
[1] Connected component labeling - Part 3 | Steve on Image Processing,http://blogs.mathworks.com/steve/2007/03/20/connected-component-labeling-part-3/
[2] accumarray - The MathWorks,http://www.mathworks.com/help/techdoc/ref/accumarray .html
[3]量子化操作のもう一つの重要な関数accumarrayの使い方をまとめる.http://www.simwe.com/forum/thread-811616-1-3.html