在执行计算时,只要可以根据索引对数组的元素进行分类,就适合使用累积函数。
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调用和计算结果可能更有效。
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可以改变此行为,来接受列向量并返回标量的函数或函数句柄。它接受一个数组和一个维度,并沿着这个维度减少数组。作为一个特殊的例外,可以直接使用内置min和max函数,并且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]
详见: accumarray.
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2