kalmanfans's Blog

模式识别 非线性预测 复杂网络 Following your heart

Matlab中 的accumarray函数

kalmanfans posted @ 2011年11月28日 16:04 in Matlab , 5931 阅读

碰到函数accumarray是在rocwood的关于寻找完全数的程序中。没找到M文件,Document中有语法分析,没看懂。结合例子,作简单说明。

Syntax

A = accumarray(sub, val)

A = accumarray(sub, val, sz)

A = accumarray(sub, val, sz, fun)

A = accumarray(sub, val, sz, fun, fillvalue)

  sub:提供累计信息的指示向量

  val:提供累计数值的向量

  sz:控制输出向量A的size

  fun:用于计算累计后向量的函数,默认为@sum,即累加

  fillvalues: 填补A中的空缺值,默认为0

 

Matlab的Document 里这么说:

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    6]

subs =     [     1     2     4     2     4    3]'  % 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的结果就是:

A =  

     1   % subs(1)==1,所以,A(1) = val(1)。  

     6   % subs(2)==subs(4)==2,所以,A(2)=val(2)+val(4)  

     6   % subs(6)==3的值, A(3) = Val (6) = 6 

    8   % subs(3)==subs(5)==4,所以,A(4)=val(3)+val(5)  

 

产生一个2*3*4的矩阵

ind = [1 1 1; 2 1 2; 2 3 4; 2 3 4];

A = accumarray(ind,11:14)

A(:,:,1) =

     11     0     0

     0     0     0

  

A(:,:,2) =

      0     0     0

    12     0     0

 

 

A(:,:,3) =

 

     0     0     0

     0     0     0

 

A(:,:,4) =

      0     0     0

     0     0    27

 

另外,关于二维和高维矩阵,只是大概知道A矩阵的维度,数值的变化不详细得知。

References:

[1] accumarray - The MathWorks http://www.mathworks.com/help/techdoc/ref/accumarray .html

[2] 向量化操作的又一重要函数accumarray的用法总结http://www.simwe.com/forum/thread-811616-1-3.html

[3] rocwood关于寻找完全数的程序

第一种:

clear;clc;close all

a=1:10000;

a(2*a'==accumarray(a',a',[],@(x)sum(a(abs(x./(1:x)-round(x./(1:x)))<eps))));

Avatar_small
Amelie Bolden 说:
2019年2月18日 09:09

The calving is devoid of the formal means for the citizens. The chance of the regulation and editing services is approved for the people. The differentiation is done for the induction of the true feelings for the instructions of the program.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter