19.4累积

在执行计算时,只要可以根据索引对数组的元素进行分类,就适合使用累积函数。

 
: A = accumarray (subs, vals)
: A = accumarray (subs, vals, sz)
: A = accumarray (subs, vals, sz, fcn)
: A = accumarray (subs, vals, sz, fcn, fillval)
: A = accumarray (subs, vals, sz, fcn, fillval, issparse)

通过将向量的元素累积到从下标定义的位置来创建数组。

下标subs和值vals从矩阵的行定义。每行subs对应于vals中的一个值,如果vals是标量,它将用于每行subs;如果subs是向量的元胞数组,那么所有向量的长度必须相同,并且第k个下标向量必须对应于结果的第k个维度。

矩阵的大小将从下标决定。但是,如果指定了sz来确定矩阵大小,那么长度sz必须与列数subs相对应。以下情况例外:如果subs只有一列,在这种情况下sz可以是向量的维数和,此时下标subs作为其中的索引。

accumarray的默认操作是对具有相同下标的元素求和。定义fcn可以改变此行为,来接受列向量并返回标量的函数或函数句柄。函数的结果不应取决于下标的顺序。

返回数组中没有与之关联的下标的元素被设置为零。定义fillval允许定义这些值。但是,定义fcn可以改变此行为。如果fcn@min@max则结果将填充最小(或最大)整数,如果vals是整数类型,如果vals是逻辑类型则返回逻辑false(或逻辑true),如果fillval为零则所有值均为非正(或非负),否则为NaN。

默认情况下accumarray返回一个完整的矩阵。如果issparse是true,则返回稀疏矩阵。

以下的accumarray示例构建了一个频率表,该表在第一列中统计第二列中每个数字的出现次数,取自向量x.注意用法unique用于赋值给所有重复元素x相同的索引(详见unique).

x = [91, 92, 90, 92, 90, 89, 91, 89, 90, 100, 100, 100];
[u, ~, j] = unique (x);
[accumarray(j', 1), u']
  ⇒  2    89
      3    90
      2    91
      2    92
      3   100

另一个示例,其中结果是多维三维数组,并且输出中显示默认值(零):

accumarray ([1, 1, 1;
             2, 1, 2;
             2, 3, 2;
             2, 1, 2;
             2, 3, 2], 101:105)
⇒ ans(:,:,1) = [101, 0, 0; 0, 0, 0]
⇒ ans(:,:,2) = [0, 0, 0; 206, 0, 208]

sparse参数可以用作sparse构造函数(详见sparse). 因此

sparse (i, j, sv)

accumarray可以写成这样

accumarray ([i, j], sv', [], [], 0, true)

对于重复索引,sparse添加相应的值。可以使用min作为累加器函数,而不是简单地取最小值:

accumarray ([i, j], sv', [], @min, 0, true)

对于非稀疏情况,accumaray的复杂度一般为O(M+N),其中N是下标的数量,M是最大下标(在多维情况下线性化)。如果fcn是其中之一:@sum(默认),@max,@min@(x) {x},那么使用优化的代码路径。请注意,对于通用归约函数,解释器开销可以发挥重要作用,并且以向量化的方式执行多个accumarray调用和计算结果可能更有效。

详见: accumdim, unique, sparse.

 
: A = accumdim (subs, vals)
: A = accumdim (subs, vals, dim)
: A = accumdim (subs, vals, dim, n)
: A = accumdim (subs, vals, dim, n, fcn)
: A = accumdim (subs, vals, dim, n, fcn, fillval)

通过将数组的切片累积到指定维度上从下标定义的位置来创建数组。

下标从subs索引向量指定。尺寸从dim指定。如果未给定,则默认为第一个非奇异维度。subs的长度必须等于size (vals, dim).

结果矩阵在工作维度中的范围将从下标本身决定。但是,如果定义n则它决定这个范围。

accumdim的默认操作是将具有相同下标的子数组求和。定义fcn可以改变此行为,来接受列向量并返回标量的函数或函数句柄。它接受一个数组和一个维度,并沿着这个维度减少数组。作为一个特殊的例外,可以直接使用内置minmax函数,并且accumdim解释了在调用中使用的中间的空参数。

返回数组中没有与之关联的下标的切片被设置为零。定义fillval允许定义这些值。

accumdim的一个使用示例是

accumdim ([1, 2, 1, 2, 1], [ 7, -10,   4;
                            -5, -12,   8;
                           -12,   2,   8;
                           -10,   9,  -3;
                            -5,  -3, -13])
⇒ [-10,-11,-1;-15,-3,5]

详见: accumaray.


版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-1