在执行计算时,只要可以根据索引对数组的元素进行分类,就适合使用累积函数。
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]
详见: accumaray.
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-1