碰到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提供的信息由兩個:
(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。當然,這只是一維的情況。
最后A的結果就是:
Steve中用accumarray實現了一個從坐標對兒中統計位置的功能:
這是accumarray一種靈活的用法。
可以非常高效地用統計一個矩陣中不重復的數值有哪些,見rocwoods的帖子 [3 ]。
太晚了,簡單寫一下,還有很多細節問題沒有列出來:二維甚至更高維的應用,除了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
