精华内容
下载资源
问答
  • 令人惊讶的是,我从未遇到过使用 accumarray 聚合数据的简单解决方案。 Accumarray 也需要提供聚合的索引。 将此与 Unique 功能相结合,用户可以使用 Accumarray 支持的任何可用和适当的功能快速方便地聚合数据。 ...
  • accumarray - 使用累加构造数组 此 MATLAB 函数 通过使用下标 subs 累积向量 val 的元素来返回数组 A。如果 subs 为列向 量,则每个元素在输出中定义一个相应的下标,下标也是一个列向量。accumarray 函数收集 val ...

    介绍

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

    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) 可以获取相同答案。
    展开全文
  • 可以等于NaN A = accumarray(subs,val,sz,fun,fillval,issparse) isspares选择A是否使用稀疏矩阵的格式 A = accumarray({subs1, subs2, …}, val,…) {subs1, subs2, …},等同于A = accumarray(subs, val,…),此时...

    先看看subs和val的具体内容

    subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2];
    subs =
    1 1 1
    2 1 2
    2 3 2
    2 1 2
    2 3 2
    val = (101:105)’
    val =
    101
    102
    103
    104
    105
    val的元素个数与subs的行数是一致的。
    A = accumarray(subs, val)的实现过程分成2步。
    第一步是把val中的元素,按照subs对应行所给出的下标放到一个新的cell矩阵B中(cell是为了方便解释,也就是说B矩阵中的每个位置可以放入多个数值),注意,subs的值是B的下标,不是val的。举例来说,subs第一行[ 1 1 1],意思就是把val中第一个元素(val(1))放入到B(1,1,1)的位置,依次类推,val(2)放入到B(2 1 2),val(3)放入到B(2 3 2),val(4)放入到B(2 1 2),val(5)放入到B(2 3 2)。此时,可以看到B(1,1,1)中有1个数(val(1));B(2 1 2)有2个数(val(2),val(4));B(2 3 2)也有2个数(val(3),val(5))。
    第二步,把B中每个单元中的数分别累加,并放入到A的对应位置。
    注:accumarray默认的是把每个单元中的数累加,因为对每个单元中的数的默认处理函数是sum。可以通过A = accumarray(subs,val,[],@fun)的调用格式来指定其他的处理函数,比如说mean。对指定的fun函数的要求是,接受列向量输入,输出单个的数值型,、字符型或逻辑型变量。
    A的维数与B相同,A中的元素默认为零。A的大小为max(subs(1))×max(subs(2))×max(subs(3))…
    因此,
    A(1,1,1)=val(1)=101;
    A (2 , 1 , 2)=val(2)+val(4)=102+104=206;
    A (2, 3 , 2)=val(3)+val(5)=1-03+105=208,
    A的其他位置都为零。输出A就得到
    A(:,:,1) =
    101 0 0
    0 0 0
    A(:,:,2) =
    0 0 0
    206 0 208
    很显然,A的维数与subs的列数相等。
    A = accumarray(subs, val)
    A = accumarray(subs,val,sz)
    sz 可以用来指定A大小,但是不能小于A = accumarray(subs, val)得到的A的大小。比如A = accumarray(subs, val)的到A是一个3×4的二维矩阵,那么sz应当为一个包含2个元素的向量sz=[m1,m2] (sz向量的长度和A的维数相等),其中,m1大于等于3,m2大于等于4. 但是,当得到的A是一个p×1的一维向量时,sz=[m,1],m大于等于p。另外,sz可以赋值为空,表示由函数自动决定A的大小。
    A = accumarray(subs,val,sz,fun)
    fun可以指定专门的处理函数,默认的处理函数为sum
    A = accumarray(subs,val,sz,fun,fillval)
    fillval指定A中元素的默认值。可以等于NaN
    A = accumarray(subs,val,sz,fun,fillval,issparse)
    isspares选择A是否使用稀疏矩阵的格式
    A = accumarray({subs1, subs2, …}, val,…)
    {subs1, subs2, …},等同于A = accumarray(subs, val,…),此时,subs=[subs1, subs2, …]或者=[subs1;subs2; …]

    展开全文
  • Kmeans 使用 accumarry 实现,灵感来自 Mo Chen ( http://www.mathworks.com/matlabcentral/fileexchange/24616 )。 性能比内置的kmeans好很多,比Mo的原作差。 主要用于演示accumarray的使用。
  • MATLAB accumarray的使用

    千次阅读 2014-08-18 11:46:23
    比如A = accumarray(subs, val)的到A是一个3×4的二维矩阵,那么sz应当为一个包含2个元素的向量sz=[m1,m2] (sz向量的长度和A的维数相等),其中,m1大于等于3,m2大于等于4. 但是,当得到的A是一个p×1的一维向量时...
    先看看subs和val的具体内容
    subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2];
    subs =
         1     1     1
         2     1     2
         2     3     2
         2     1     2
         2     3     2
    val = (101:105)'
    val =
       101
       102
       103
       104
       105
    val的元素个数与subs的行数是一致的。
    A = accumarray(subs, val)的实现过程分成2步。
    第一步是把val中的元素,按照subs对应行所给出的下标放到一个新的cell矩阵B中(cell是为了方便解释,也就是说B矩阵中的每个位置可以放入多个数值),注意,subs的值是B的下标,不是val的。举例来说,subs第一行[ 1     1     1],意思就是把val中第一个元素(val(1))放入到B(1,1,1)的位置,依次类推,val(2)放入到B(2     1     2),val(3)放入到B(2     3    2),val(4)放入到B(2     1     2),val(5)放入到B(2    3   2)。此时,可以看到B(1,1,1)中有1个数(val(1));B(2     1    2)有2个数(val(2),val(4));B(2       2)也有2个数(val(3),val(5))。
    第二步,把B中每个单元中的数分别累加,并放入到A的对应位置。
    注:accumarray默认的是把每个单元中的数累加,因为对每个单元中的数的默认处理函数是sum。可以通过A = accumarray(subs,val,[],@fun)的调用格式来指定其他的处理函数,比如说mean。对指定的fun函数的要求是,接受列向量输入,输出单个的数值型,、字符型或逻辑型变量。
    A的维数与B相同,A中的元素默认为零。A的大小为max(subs(1))×max(subs(2))×max(subs(3))...
    因此,
    A(1,1,1)=val(1)=101;
    A (2 , 1 , 2)=val(2)+val(4)=102+104=206;
    A (2, 3 ,  2)=val(3)+val(5)=1-03+105=208,
    A的其他位置都为零。输出A就得到
    A(:,:,1) =
       101     0     0
         0     0     0
    A(:,:,2) =
         0     0     0
       206     0   208
    很显然,A的维数与subs的列数相等。
    A = accumarray(subs, val)
    A = accumarray(subs,val,sz)
    sz 可以用来指定A大小,但是不能小于A = accumarray(subs, val)得到的A的大小。比如A = accumarray(subs, val)的到A是一个3×4的二维矩阵,那么sz应当为一个包含2个元素的向量sz=[m1,m2] (sz向量的长度和A的维数相等),其中,m1大于等于3,m2大于等于4. 但是,当得到的A是一个p×1的一维向量时,sz=[m,1],m大于等于p。另外,sz可以赋值为空,表示由函数自动决定A的大小。
    A = accumarray(subs,val,sz,fun)
    fun可以指定专门的处理函数,默认的处理函数为sum
    A = accumarray(subs,val,sz,fun,fillval)
    fillval指定A中元素的默认值。可以等于NaN
    A = accumarray(subs,val,sz,fun,fillval,issparse)
    isspares选择A是否使用稀疏矩阵的格式
    A = accumarray({subs1, subs2, ...}, val,...)
    {subs1, subs2, ...},等同于A = accumarray(subs, val,...),此时,subs=[subs1, subs2, ...]或者=[subs1;subs2; ...]
    展开全文
  • Matlab函数accumarray的用法

    万次阅读 2011-04-27 02:17:00
    碰到accumarray 这个函数是在Steve的文章[1 ]中。这是一个很灵活的build-in函数,所以是没有m文件,看不到实现代码的。开始理解起来比较拗,看了看例子知道什么意思了。Matlab的Help [2 ]里这么说:...

    碰到accumarray 这个函数是在Steve的文章[1 ]中。

     

    这是一个很灵活的build-in函数,所以是没有m文件,看不到实现代码的。

     

    开始理解起来比较拗,看了看例子知道什么意思了。

     

    Matlab的Help [2 ]里这么说:

    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    ]

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

     

    Steve中用accumarray实现了一个从坐标对儿中统计位置的功能:

     

    这是accumarray一种灵活的用法。

     

    可以非常高效地用统计一个矩阵中不重复的数值有哪些,见rocwoods的帖子 [3 ]。

     

    太晚了,简单写一下,还有很多细节问题没有列出来:二维甚至更高维的应用,除了sum还可以自己定义函数处理等等,知道大概意思之后,可以仔细看Matlab的Help[2 ]了。

    References:

    [1] Connected component labeling - Part 3 | Steve on Image Processing,http://blogs.mathworks.com/steve/2007/03/20/connected-component-labeling-part-3/

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

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

     

    展开全文
  • MATLAB accumarray

    2019-04-29 15:30:00
    比如A = accumarray(subs, val)的到A是一个3×4的二维矩阵,那么sz应当为一个包含2个元素的向量sz=[m1,m2] (sz向量的长度和A的维数相等),其中,m1大于等于3,m2大于等于4. 但是,当得到的A是一个p×1的一维向量时...
  • Matlab accumarray函数

    千次阅读 2011-07-31 20:58:54
    A = accumarray(subs,val,sz,fun,fillval)  sub:提供累计信息的指示向量  val:提供累计数值的向量  sz:控制输出向量A的size  fun:用于计算累计后向量的函数,默认为@sum,即累加 fillval:填补A中的...
  • accumarray() accumarray() sort() unique() 快速去掉向量中指定元素
  • arma::mat accumarray (arma::mat& subs, arma::vec& val, arma::rowvec& sz) { arma::u32 ar = sz.col(0)(0); arma::u32 ac = sz.col(1)(0); arma::mat A; A.set_size(ar, ac); for (arma::u32 r
  • %读入全文 [c,~,freq] = find(accumarray(uint16(str(:)),1)); fprintf('%c %d\n',[c freq]') fprintf('\n'); rank(:,1) = c; rank(:,2) = freq; ans=sortrows(rank,-2); %只根据第二列进行排序 -2表示降序 ans(:,3...
  • 将 Matlab 数据收集到基于分组变量的元胞数组中,类似于(但比) accumarray 更灵活。
  • 最近,由于科研工作需求,需要处理某一类波动信号,遂利用经验模态分解(EMD)、集合经验模态分解(EEMD)和希尔伯特-黄变换对上述信号进行处理,期望获取有用的本征模态函数(IMF)、频率信息和边际谱等。...
  •  A_counts = accumarray(ic,1); % 计算 C中的每个元素在A中出现的次数 value_counts = [C,A_counts]; % 汇总结果 如果是矩阵(向量)A中每个元素出现的次数,[C,ia,ic] = unique(A); % 这里不加‘rows’就可以啦 ...
  • unique+length函数组合
  • matlab部分 根据某一列数据求另一列的平均值: function city=region(city)[a,~,ic] = unique(city(:,1),...b=accumarray(ic,city(:,2),[],@mean)h=length(a)for i=1:h city(city(:,1)==b(i,1),3)=b(i,2);endretur...
  • Numpy

    2015-04-10 20:47:47
    creation slicing : is view fancy indexing : is copy
  • 语法翻译(2)...

    2016-05-27 21:37:00
    从分析树到语法树...什么意思呢, 就说这个图中其实很多节点是多余的, 比如左右括号, 还有从E到3其实可以直接由3代替E等等, 因为到了分析树这一阶段, 其实优先级结合性都已经由树的结构简介的体现出来了, 所以用于...
  • 为了完成这三个核心函数,使用了:eqnsol、unique 和 accumarray。 该函数的其余部分是操作数据以在函数之间传递。 此函数将输出数据的累积季节性总计。 它是应用程序是有限的 ACCUMARRAY matlab 函数的默认参数化...
  • 矩阵,其中Y(i) = 乐趣(Bi(:)) 这个函数只是 accumarray 的一个简单包装! 另请参见: accumarray 例子 : rand('twister',12); x=地板(2*rand(9,9)) x = 0 0 1 1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 0 1 1 1 0 0
  • 此函数确定 ND 数组的唯一值,并使用 MATLAB 的 accumarray 函数对这些值的实例进行计数,或者在 accumarray 不合适的情况下,使用更传统的 sort-diff 方法。 它的主要用途是非常快速地计算数组中唯一值的实例数。 ...
  • 备忘hbase

    2017-06-20 17:42:36
    commons-codec commons-codec 1.9 commons-collections commons-collections 3.2.2 commons-configuration commons-configuration ... commons-l...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 147
精华内容 58
关键字:

accumarray