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
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
NaN
1.7500
NaN
NaN
1.5000
NaN
1.2500
NaN
NaN
NaN
个人理解大概是个这样的过程,接下来再去看matlab的help文件就比较容易懂了。
doc accumarray
No comments:
Post a Comment