精华内容
下载资源
问答
  • MATLAB中accumarray函数详解

    千次阅读 2018-10-17 10:17:28
    注:accumarray默认的是把每个单元的数累加,因为对每个单元的数的默认处理函数是sum。可以通过A = accumarray(subs,val,[],@fun)的调用格式来指定其他的处理函数,比如说mean。对指定的fun函数的要求是,接受列...

     

    原文链接:https://blog.csdn.net/liuhuicsu/article/details/70739459?utm_source=blogxgwz0

    先看看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; ...]

    展开全文
  • MATLAB 函数 通过使用下标 subs 累积向量 val 的元素来返回数组 A。如果 subs 为列向 量,则每个元素在输出定义一个相应的下标,下标也是一个列向量。accumarray 函数收集 val 的在 subs 具有相同下标的所有...

    介绍

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

    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) 可以获取相同答案。
    展开全文
  • Matlab accumarray函数

    2021-04-20 11:54:36
    A = accumarray(subs,val,sz,fun,fillval)sub:提供累计信息的指示向量val:提供累计数值的向量sz:控制输出向量A的sizefun:用于计算累计后向量的函数,默认为@sum,即累加fillval:填补A的空缺项,默认为0例子:...

    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

    意思就是,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

    个人理解大概是个这样的过程,接下来再去看matlab的help文件就比较容易懂了。

    doc accumarray

    展开全文
  • Matlab函数accumarray的用法

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

    碰到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

     

    展开全文
  • 碰到函数accumarray是在rocwood的关于寻找完全数的程序。没找到M文件,Document有语法分析,没看懂。结合例子,作简单说明。SyntaxA = accumarray(sub, val)A = accumarray(sub, val, sz)A = accumarray(sub, ...
  • B= accumarray(ind,data)根据ind指定的组,通过对向量data的元素进行累加来对组数据求和。然后计算每组的总和。ind的值定义数据所属的组以及存储每个组总和的输出数组B的索引。要按顺序返回组总和,请将ind指定...
  • 令人惊讶的是,我从未遇到过使用 accumarray 聚合数据的简单解决方案。 Accumarray 也需要提供聚合的索引。 将此与 Unique 功能相结合,用户可以使用 Accumarray 支持的任何可用和适当的功能快速方便地聚合数据。 ...
  • 先看看subs和val的具体内容subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2];subs =111212232212232val = (101:105)'val =101102103104105val的元素个数与subs的行数是一致的。...第一步是把val的元素,按照sub...
  • 先看看subs和val的具体内容subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2];subs =111212232212232val = (101:105)'val =101102103104105val的元素个数与subs的行数是一致的。...第一步是把val的元素,按照sub...
  • * * * MATLAB 向量化函数 Matlab从7.0开始,陆续增加了一些向量函数,使用这些... 简介 accumarray函数 arrayfun函数 bsxfun函数 cellfun函数 spfun函数 accumarray函数 A = accumarray(subs,val)A = accumarray(sub...
  • 第一步是创建一个可以为给定字符串生成n-gram的函数.以矢量化方式执行此操作的一种方法是使用一些聪明的索引.function [subStrings, counts] = n_gram(fullString, N)if (N == 1)[subStrings, ~, index] = unique...
  • matlab中的sparse函数使用

    千次阅读 2020-11-01 17:10:53
    size(S) ans = 1×2 1500 1500 预分配稀疏矩阵的存储空间 尝试此示例 View MATLAB Command N = nnz(S) N = 10 N_alloc = nzmax(S) N_alloc = 100 spalloc 函数可以快速创建由全零元素构成的稀疏矩阵,同时还会在...
  • 我在下面展示了一个在MATLAB和Python/Numpy的示例silhouette实现(请记住,我对MATLAB比较流利):1) MATLAB语言function s = mySilhouette(X, IDX)%# X : matrix of size N-by-p, data where rows are instances%# ...
  • 您可以将行索引用作“vals”(second input到accumarray)并定义您自己的函数,该函数对数据组执行加权平均值:Weights = data(:,3); Vals = data(:,2); % pick your columns hereWeightedMeanFcn = @(ii) sum(Vals(ii)...
  • [2018年最新整理]matlab函数表数组和矩阵(基本信息)编辑本段回目录disp显示文本或数组display显示文字或数组(重载方法)isempty确定是否为空数组isequal测试数组平等isequalwithequalnans测试数组平等,平等对待纳斯...
  • 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
  • matlab函数

    千次阅读 2017-08-04 18:30:53
    matlab文档 http://cn.mathworks.com/help/ 函数表 数组和矩阵(基本信息) disp 显示文本或数组 display 显示文字或数组 ( 重载方法 ) ...
  • MATLAB accumarray

    2019-04-29 15:30:00
    注:accumarray默认的是把每个单元的数累加,因为对每个单元的数的默认处理函数是sum。可以通过A = accumarray(subs,val,[],@fun)的调用格式来指定其他的处理函数,比如说mean。对指定的fun函数的要求是,接受列...
  • 在我之前的问题:嵌套for循环在MATLAB中非常慢(预分配)我意识到使用矢量化函数与4个嵌套循环在运行时间上产生了7倍的差异。在该示例,不是循环遍历4维阵列的所有维度并计算每个向量的中值,而是仅调用中值(stack...
  • MATLAB工具常用函数

    2019-09-18 19:15:32
    MATLAB 是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。使用 MATLAB,可以较使用传统的编程语言(如 C、C++ 和 Fortran)更快地解决技术计算问题。 应用范围:包括信号和...
  • 于是网上搜索代码整理成MATLAB可以用的计算函数VectorMI ------------------------------------------------------------------------------------------------------- function [MI,mi] = VectorMI(u1,u2,wind_...

空空如也

空空如也

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

matlab中accumarray函数

matlab 订阅