MATLAB accumarray 函数详解
accumarray - 使用累加构造数组此 MATLAB 函数 通过使用下标 subs 累积向量 val 的元素来返回数组 A。如果 subs 为列向量,则每个元素在输出中定义一个相应的下标,下标也是一个列向量。accumarray 函数收集 val的在 subs 中具有相同下标的所有元素,并将这些元素之和存储在 A 中对应于该下标的位置(对于索引 i,A(i)=sum(val(subs(:)=
·
accumarray 函数详解
介绍
最近发现一个很有趣的函数
官方的介绍是:
accumarray - 使用累加构造数组
此 MATLAB 函数 通过使用下标 subs 累积向量 val 的元素来返回数组 A。
如果 subs 为列向量,则每个元素在输出中定义一个相应的下标,下标也
是一个列向量。accumarray 函数收集 val的在 subs 中具有相同下标的所
有元素,并将这些元素之和存储在 A 中对应于该下标的位置(对于索引
i,A(i)=sum(val(subs(:)==i)))。若 A 的某些元素的下标未出现在 subs
中,则这些元素等于 0。
常用的几种用法如下
A = accumarray(subs,val)
A = accumarray(subs,val,sz)
A = accumarray(subs,val,sz,fun)
A = accumarray(subs,val,sz,fun,fillval)
A = accumarray(subs,val,sz,fun,fillval,issparse)
详解
输入:
subs :(必要) 数据坐标,为列向量 (也称下标矩阵)
val :(必要) 数据 1. 若为向量长度需与subs行数相同 2.若为标量是扩充标量
sz :(选填) 输出矩阵尺寸 默认表达 [] 默认大小由subs的值确定
fun :(选填) 函数累加 默认表达 [] 默认函数为 @sum
fillval :(选填) 填充值 默认表达 [] 默认值为 0
issparse:(选填)输出稀疏性,指定为数值或逻辑值 1 (true) 或 0 (false)。 默认值为0 (false)
如果希望输出数组为稀疏数组,请指定 true 或 1。
如果 issparse 是 true 或 1:
1. fillval 必须是 0 或 []。
2. val 中的值和 fun 的输出值都必须为 double 类型。
输出:
A :输出sz大小的矩阵,默认大小由subs决定
一句话就是定义一个sz大小,值全为fillval的矩阵,对subs位置的值val进行fun函数运算。(至于稀疏矩阵,数学没学好,我也不太懂)
示例
计算 bin 计数 (val=1)
- A = accumarray(subs,val)
>> subs = [1; 2; 4; 2; 4]
subs = 5×1
1
2
4
2
4
>> A = accumarray(subs,1)
A = 4×1
1
2
0
2
% subs为5行2列坐标矩阵,最大为4,说明默认输出4行1列矩阵;
% va为1,说明每个数据值为1,因此累加开始,
% 1个1,2个2,2个4对应着第1行为1,第2,4行为2;
% 没有3则第3行为0
结果为一个 bin 计数向量。使用 histcounts(subs,‘BinMethod’,‘integers’) 可以获取相同答案。但是,accumarray 也可以计算更高维度网格上的 bin 计数。
>> subs = [1 1; 2 2; 3 2; 1 1; 2 2; 4 1]
subs = 6×2
1 1
2 2
3 2
1 1
2 2
4 1
>> A = accumarray(subs,1)
A =
2 0
0 2
0 1
1 0
%subs 第一列最大为4,第二列最大为2,默认输出为4行2列矩阵
%对应坐标(1,1)(2,2)(3,2)(1,1)(2,2)(4,1)
累加数据 (val ≠ 1)
>> val = 101:105;
>> subs = [1; 3; 4; 3; 4];
>> A = accumarray(subs,val)
A = 4×1
101
0
206
208
% val 为101到105递增值,个数与subs行数对应,根据subs坐标对输出累加
% 第1行 +101 第3行 +102 第4行 +103
% 第3行 +104 第4行 +105
>> val = 101:106;
>> subs = [1 1; 2 2; 3 2; 1 1; 2 2; 4 1];
>> A = accumarray(subs,val)
A = 4×2
205 0
0 207
0 103
106 0
%同上分析
% (1,1) +101 (2,2) +102 (3,2) +103
% (1,1) +104 (2,2) +105 (4,1) +106
指定输出大小 (sz)
- A = accumarray(subs,val,sz)
sz :限定输出尺寸大小,比默认输出大,补0,默认表达 [ ]
>> val = 101:106;
>> subs = [1 1; 2 2; 3 2; 1 1; 2 2; 4 1];
>> A = accumarray(subs,val,[4 4])
A = 4×4
205 0 0 0
0 207 0 0
0 103 0 0
106 0 0 0
自定义函数 (fun)
- A = accumarray(subs,val,sz,fun)
fun:函数语柄 ,默认求和(@sum)
(这也是个很有意思的东西,等小一后期专门写一篇汇总)
>> val = [100.1 101.2 103.4 102.8 100.9 101.5]';
>> subs = [1 1; 1 1; 2 2; 3 2; 2 2; 3 2];
>> A1 = accumarray(subs,val,[],@var) % var为求方差
A1 = 3×2
0.6050 0
0 3.1250
0 0.8450
填充矩阵 (fillval)
- A = accumarray(subs,val,sz,fun,fillval)
fillval: 为填充值,默认0 ,
>> val = 101:106;
>> subs = [1 1; 2 2; 3 2; 1 1; 2 2; 4 1];
>> A = accumarray(subs,val,[4,3],[],4)
A = 4×3
205 4 4
4 207 4
4 103 4
106 4 4
>> A = accumarray(subs,val,[4,3],[],NaN)
A =
205 NaN NaN
NaN 207 NaN
NaN 103 NaN
106 NaN NaN
输出稀疏矩阵 (issparse)
- A = accumarray(subs,val,sz,fun,fillval,issparse)
issparse=true
结果为稀疏矩阵。使用 sparse(subs(:,1),subs(:,2),val) 可以获取相同答案。
更多推荐
所有评论(0)