Tuesday, June 19, 2012

Matlab accumarray 函数


A = accumarray(subs,val,sz,fun,fillval)
  sub:提供累计信息的指示向量
   val:提供累计数值的向量
    sz:控制输出向量A的size
   fun:用于计算累计后向量的函数,默认为@sum,即累加
fillval:填补A中的空缺项,默认为0


例子:
myfun = @(x) 1./(2*numel(x)) * sum(x);

myfun = 

    @(x)1./(2*numel(x))*sum(x)
subs=[7,2,5,7,2]';

subs =

     7
     2
     5
     7
     2
val=1:5;

val =

     1     2     3     4     5
sz=[10,1];

sz =

    10     1
A=accumarray(subs,val,sz,myfun,nan);

A =

       NaN
    1.7500
       NaN
       NaN
    1.5000
       NaN
    1.2500
       NaN
       NaN
       NaN

个人对此函数的理解:
首先,函数根据参数中sz,生成一个中间矩阵B,此例中sz=[10,1],所以B是一个10*1的矩阵。
然后,函数根据subs中的指示,将val中的数值摆放到B中。
  subs  val
     7     1
     2     2
     5     3
     7     4
     2     5
意思就是,val中的1被扔到了B中第7的位置,同样,2扔到B中第2个位置,3到B中5,4到B中7,5到2。
这样B中的2,5,7位就被摆放上了数值,而且,2和7两个位置上被摆上了2个数值。

B =

   NaN
   2,5
   NaN
   NaN
   3
   NaN
   1,4
   NaN
   NaN
   NaN
其他还有7个位置并没有被摆放任何数值,我们暂时不管他,给他扔上NaN。
然后,accumarray函数就会根据自定义的函数myfun,来计算了。拿什么算呢,拿的就是这个中间矩阵B,我们定义的myfun意义就是均值的一般,所以也可以定义的时候写成:
myfun = @(x) mean(x)./2;

这下就简单了,就相当于mean(B)./2,然后得出的结果就是A了。
A =

       NaN
    1.7500
       NaN
       NaN
    1.5000
       NaN
    1.2500
       NaN
       NaN
       NaN
个人理解大概是个这样的过程,接下来再去看matlab的help文件就比较容易懂了。
doc accumarray

No comments:

Post a Comment