Main Content

accumarray

累加向量元素

说明

示例

B = accumarray(ind,data) 根据 ind 中指定的组,通过对向量 data元素进行累加来对组数据求和。然后计算每组的总和。ind 中的值定义数据所属的组以及存储每个组总和的输出数组 B 的索引。

要按顺序返回组总和,请将 ind 指定为向量。然后,对于索引为 i 的组,accumarray 返回其在 B(i) 中的总和。例如,如果 ind = [1 1 2 2]'data = [1 2 3 4]',则 B = accumarray(ind,data) 返回列向量 B = [3 7]'

要以另一种形状返回组总和,请将 ind 指定为矩阵。对于 m×n 矩阵 ind,其中每一行的值表示指定的组和输出 B 的 n 维索引。例如,如果 ind 包含 [3 4] 形式的两行,则 data 中对应元素的总和存储在 B 的 (3,4) 元素中。

B 中未在 ind 中显示其索引的元素默认用 0 填充。

示例

B = accumarray(ind,data,sz) 返回填充到 sz 大小的数组 B。将 sz 指定为正整数向量,该向量等于或大于 ind 中的维度长度。输出中的额外元素用 0 填充。将 sz 指定为 [],让 ind 中的索引确定输出的大小。

示例

B = accumarray(ind,data,sz,fun) 将函数 fun 应用于由 ind 指定的 data 中的每个组。使用 @ 符号指定 fun,如 @mean,或指定为 [] 以使用默认值 @sum

示例

B = accumarray(ind,data,sz,fun,fillval) 使用标量值 fillval 填充未被 ind 中的任何索引引用的 B 的所有元素。将 fillval 指定为 [] 以使用默认值 0

示例

B = accumarray(ind,data,sz,fun,fillval,issparse) 返回数组 B,当 issparsetrue1 时,该数组是稀疏数组;如果 issparsefalse0,则该数组为满数组。默认情况下,输出 B 为完全数组。

示例

全部折叠

创建一个数据向量和一个对应的定义组的向量 ind

data = (1:6)'
data = 6×1

     1
     2
     3
     4
     5
     6

ind = [1 3 4 2 4 1]'
ind = 6×1

     1
     3
     4
     2
     4
     1

ind 中指定的组对 data 中的值求和。

B = accumarray(ind,data)
B = 4×1

     7
     4
     2
     8

或者,使用 groupsummary 函数,将 'sum' 指定为组计算。

B = groupsummary(data,ind,'sum')
B = 4×1

     7
     4
     2
     8

创建一个组向量。

ind = [1 1 4 2 4 3]';

对数字 1 应用标量扩展,以对 ind 中定义的每个组中的元素数进行计数。

B = accumarray(ind,1)
B = 4×1

     2
     1
     1
     2

也可以使用 groupcounts 函数。

B = groupcounts(ind)
B = 4×1

     2
     1
     1
     2

创建一个数据向量和一个定义数据组的输出索引矩阵 ind

data = 1:6
data = 1×6

     1     2     3     4     5     6

ind = [1 1; 2 2; 3 2; 1 1; 2 2; 4 1]
ind = 6×2

     1     1
     2     2
     3     2
     1     1
     2     2
     4     1

针对 ind 中的每个组,对 data 中的值求和。ind 中的索引定义一个表示输出位置的 4×2 矩阵。

B1 = accumarray(ind,data)
B1 = 4×2

     5     0
     0     7
     0     3
     6     0

通过将输出大小指定为 [4 4],将输出填充到 4×4 矩阵。

B2 = accumarray(ind,data,[4 4])
B2 = 4×4

     5     0     0     0
     0     7     0     0
     0     3     0     0
     6     0     0     0

计算组方差而不是总和。

创建一个数据向量和一个定义数据组的矩阵 ind

data = [100.1 101.2 103.4 102.8 100.9 101.5]'
data = 6×1

  100.1000
  101.2000
  103.4000
  102.8000
  100.9000
  101.5000

ind = [1 1; 1 1; 2 2; 3 2; 2 2; 3 2]
ind = 6×2

     1     1
     1     1
     2     2
     3     2
     2     2
     3     2

通过将函数句柄 @var 指定为方法输入来计算每个组的方差。此语法将 var 函数(而不是 sum)应用于组。

B1 = accumarray(ind,data,[],@var)
B1 = 3×2

    0.6050         0
         0    3.1250
         0    0.8450

您可以将组计算指定为接受向量输入并返回标量的匿名函数。当您要向函数传递其他参量时,这很有用。例如,使用带归一化参量值 1var 函数。

A2 = accumarray(ind,data,[],@(x) var(x,1))
A2 = 3×2

    0.3025         0
         0    1.5625
         0    0.4225

通过对方法输入使用匿名函数,为 sum 函数指定其他参量。

创建一个数据向量和一个矩阵 ind,后者定义数据组和输出中的三维索引。

data = int8(10:15)
data = 1x6 int8 row vector

   10   11   12   13   14   15

ind = [1 1 1; 1 1 1; 1 1 2; 1 1 2; 2 3 1; 2 3 2]
ind = 6×3

     1     1     1
     1     1     1
     1     1     2
     1     1     2
     2     3     1
     2     3     2

通过使用 sum 函数的 'native' 选项,以原生整数类 int8 按组对数据求和。为此,请对方法输入使用 @(x) sum(x,'native') 指定匿名函数。结果为一个 int8 类型的 2×3×2 多维数组。

B = accumarray(ind,data,[],@(x) sum(x,'native'))
B = 2x3x2 int8 array
B(:,:,1) =

   21    0    0
    0    0   14


B(:,:,2) =

   25    0    0
    0    0   15

创建一个数据向量和一个定义数据组的矩阵 ind

data = 1:10
data = 1×10

     1     2     3     4     5     6     7     8     9    10

ind = [1 1; 1 1; 1 1; 1 1; 2 1; 2 1; 2 1; 2 1; 2 1; 2 2]
ind = 10×2

     1     1
     1     1
     1     1
     1     1
     2     1
     2     1
     2     1
     2     1
     2     1
     2     2

data 的元素分组到元胞数组。

B = accumarray(ind,data,[],@(x) {x})
B=2×2 cell array
    {4x1 double}    {0x0 double}
    {5x1 double}    {[      10]}

验证向量元素的顺序是否与 data 中出现的顺序相同。

B{2,1}
ans = 5×1

     5
     6
     7
     8
     9

创建一个数据向量和一个定义数据组的矩阵 ind

data = (101:106)'
data = 6×1

   101
   102
   103
   104
   105
   106

ind = [1 1; 2 2; 3 3; 1 1; 2 2; 4 4]
ind = 6×2

     1     1
     2     2
     3     3
     1     1
     2     2
     4     4

ind 中的元素为输出定义一个 4×4 矩阵,但仅引用 16 个元素中的 4 个。默认情况下,输出中的其他 12 个元素为 0。用 NaN 值而不是 0 值填充额外的输出元素。

B = accumarray(ind,data,[],[],NaN)
B = 4×4

   205   NaN   NaN   NaN
   NaN   207   NaN   NaN
   NaN   NaN   103   NaN
   NaN   NaN   NaN   106

创建一个数据向量和一个定义数据组的矩阵 ind

data = [34 22 19 85 53 77 99 6];
ind = [1 1; 400 400; 80 80; 1 1; 400 400; 400 400; 80 80; 1 1]
ind = 8×2

     1     1
   400   400
    80    80
     1     1
   400   400
   400   400
    80    80
     1     1

ind 中的元素为输出定义一个 400×400 矩阵,但仅引用 160,000 个元素中的 3 个。当 accumarray 的输出导致生成一个含低密度非零元素的大型数组时,您可以通过将 issparse 选项指定为 true 来节省内存,即创建稀疏矩阵而不是满矩阵。

B = accumarray(ind,data,[],[],[],true)
B = 
   (1,1)      125
  (80,80)     118
 (400,400)    152

输入参数

全部折叠

输出索引,指定为向量、矩阵或向量元胞数组。

  • 如果 ind 是向量,则每个元素都指定输出数组的一个索引并定义由 accumarray 累加的组。所有元素必须为正整数,并且 ind 的长度必须与数据向量的长度匹配。

  • 如果 ind 是 m×n 矩阵,则每行都指定一个输出的 n 维索引。ind 中的第 i 行对应于数据中的第 i 个值,ind 的行数必须与数据向量的长度匹配。例如,如果 ind 是 3×2 矩阵,则它包含三个二维索引。每行的第一个元素是输出的行索引,第二个元素是列索引。

  • 如果 ind 是索引向量元胞数组,则每个向量的长度必须相同,并且它们被视为列。

要累加的数据,指定为标量或向量。

  • 如果 data 是标量,则其值是扩展标量。

  • 如果 data 为向量,它的长度必须与索引数组中的行数相同。

输出数组的大小,指定为正整数向量或 []。例如,sz = [5 7] 产生一个 5×7 输出数组。当您为大小指定 [] 时,索引数组中的值确定输出的大小。sz 中的维度长度必须等于或大于索引数组中的维度长度。

组计算,指定为函数句柄。accumarray 按组累加数据向量的元素,然后将函数 fun 应用于组元素。当您指定 fun = [] 时,计算使用默认函数 sum。指定的函数必须接受列向量并返回数值、logicalchar 标量或标量 cell。有关函数句柄的详细信息,请参阅创建函数句柄

示例: fun = @max

当输出的元素与索引数组中提供的索引不对应时的填充值,指定为标量或 [],后者使用默认值 0fillval 的数据类型必须与计算函数输出的数据类型匹配。

输出稀疏性,指定为数值或逻辑值 1 (true) 或 0 (false)。

issparsetrue1 时,填充值必须为 0[],并且计算函数的输入数据和输出必须均为 double 类型。

输出参量

全部折叠

输出数组,以向量、矩阵或多维数组形式返回。B 与组计算函数返回的值具有相同的数据类型。

当未指定 B 的大小时,输出大小取决于索引数组 ind

  • 如果 ind 是一个列向量,则 B 是长度为 max(ind,[],1) 的列向量。

  • 如果 ind 是具有多列的矩阵,则 B 是大小为 max(ind,[],1) 的多维数组。

详细信息

全部折叠

累加元素

下图描述了 accumarray 作用于在 12 个月的时间段中获取的温度数据向量的行为。为了得出每个月的最大温度读数,accumarraymax 函数应用于在 month 中具有相同索引的 temperature 中的每组值。

month 中的值都不指向输出的 5、6、7 或 10 位置。默认情况下,这些索引处的输出 maxTemp 的元素是 0

Behavior of accumarray using the max function on vectors of month indices and temperature data. The output maxTemp contains the maximum temperature for each unique month

提示

  • accumarray 的行为类似于函数 groupsummarygroupcounts,后者分别用于按组计算摘要统计量和对组中的元素数进行计数。有关 MATLAB® 中的更多分组功能,请参阅数据的预处理

  • accumarray 的行为还与 histcounts 函数的行为类似。

    • histcounts 使用 bin 边界将连续值分组置入某个一维范围中。accumarray 使用 n 维索引对数据进行分组。

    • histcounts 只能返回 bin 计数和 bin 位置。accumarray 可以对数据应用任何函数。

    您可以将 accumarraydata = 1 结合使用来模拟 histcounts 的行为。

  • sparse 函数也具有与 accumarray 类似的累积行为。

    • sparse 使用二维索引对数据进行分组,而 accumarray 使用 n 维索引对数据进行分组。

    • 对于索引相同的元素,sparse 应用 sum 函数(对于 double 值)或 any 函数(对于 logical 值),并在输出矩阵中返回标量结果。accumarray 默认求和,但可以将任何函数应用于数据。

扩展功能

版本历史记录

在 R2006a 之前推出