介绍

最近发现一个很有趣的函数
官方的介绍是:

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)

  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)

  1. 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)

  1. 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)

  1. 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)

  1. A = accumarray(subs,val,sz,fun,fillval,issparse)
    issparse=true
    结果为稀疏矩阵。使用 sparse(subs(:,1),subs(:,2),val) 可以获取相同答案。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐