1. 程式人生 > >MATLAB中accumarray函式詳解

MATLAB中accumarray函式詳解

 

原文連結:https://blog.csdn.net/liuhuicsu/article/details/70739459?utm_source=blogxgwz0

先看看subs和val的具體內容

subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2];
subs =
     1     1     1
     2     1     2
     2     3     2
     2     1     2
     2     3     2
val = (101:105)'
val =
   101
   102
   103
   104
   105
val的元素個數與subs的行數是一致的。
A = accumarray(subs, val)的實現過程分成2步。
第一步是把val中的元素,按照subs對應行所給出的下標放到一個新的cell矩陣B中(cell是為了方便解釋,也就是說B矩陣中的每個位置可以放入多個數值),注意,subs的值是B的下標,不是val的。舉例來說,subs第一行[ 1     1     1],意思就是把val中第一個元素(val(1))放入到B(1,1,1)的位置,依次類推,val(2)放入到B(2     1     2),val(3)放入到B(2     3    2),val(4)放入到B(2     1     2),val(5)放入到B(2    3   2)。此時,可以看到B(1,1,1)中有1個數(val(1));B(2     1    2)有2個數(val(2),val(4));B(2     3    2)也有2個數(val(3),val(5))。
第二步,把B中每個單元中的數分別累加,並放入到A的對應位置。
注:accumarray預設的是把每個單元中的數累加,因為對每個單元中的數的預設處理函式是sum。可以通過A = accumarray(subs,val,[],@fun)的呼叫格式來指定其他的處理函式,比如說mean。對指定的fun函式的要求是,接受列向量輸入,輸出單個的數值型,、字元型或邏輯型變數。
A的維數與B相同,A中的元素預設為零。A的大小為max(subs(1))×max(subs(2))×max(subs(3))...
因此,
A(1,1,1)=val(1)=101;
A (2 , 1 , 2)=val(2)+val(4)=102+104=206;
A (2, 3 ,  2)=val(3)+val(5)=1-03+105=208,
A的其他位置都為零。輸出A就得到
A(:,:,1) =
   101     0     0
     0     0     0
A(:,:,2) =
     0     0     0
   206     0   208
很顯然,A的維數與subs的列數相等。
A = accumarray(subs, val)
A = accumarray(subs,val,sz)
sz 可以用來指定A大小,但是不能小於A = accumarray(subs, val)得到的A的大小。比如A = accumarray(subs, val)的到A是一個3×4的二維矩陣,那麼sz應當為一個包含2個元素的向量sz=[m1,m2] (sz向量的長度和A的維數相等),其中,m1大於等於3,m2大於等於4. 但是,當得到的A是一個p×1的一維向量時,sz=[m,1],m大於等於p。另外,sz可以賦值為空,表示由函式自動決定A的大小。
A = accumarray(subs,val,sz,fun)
fun可以指定專門的處理函式,預設的處理函式為sum
A = accumarray(subs,val,sz,fun,fillval)
fillval指定A中元素的預設值。可以等於NaN
A = accumarray(subs,val,sz,fun,fillval,issparse)
isspares選擇A是否使用稀疏矩陣的格式
A = accumarray({subs1, subs2, ...}, val,...)
{subs1, subs2, ...},等同於A = accumarray(subs, val,...),此時,subs=[subs1, subs2, ...]或者=[subs1;subs2; ...]