1、accumarrayhttp:/ 语法 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)accumarray(subs1, subs2, ., val, .) 描述 accumarray 从一个数据集的元素构造组,并适用于每个组的函数 A = accumarray(subs,val)积累元素的载体 val
2、和索引 subs 创建一个数组 A。subs 中的一个元素的位置确定的值在累计矢量中设置; subs 中的一个元素的值确定的位置的累积的矢量在输出中。 A = accumarray(subs,val,sz) 创建一个数组 A,大小 sz,其中 sz 是一个向量的正整数。如果 subs 不为空,N 1 列,那么您必须有 N 个元素,其中 all(sz = max(subs,1)。如果 subs 是一个非空的列向量,然后 sz 必须是M 1,其中 e M = MAX(subs).。sz 默认指定为 A = accumarray(subs,val,sz,fun)函数 fun 的每个子集的元素的 va
3、l. accumarray 函数默认情况下是 sum。要指定其他函数的 fun,使用符号(例如,max) 。函数 fun 必须接受一个列向量,并返回一个数字,逻辑,或字符标,或一个标量单元。返回值 A与作为返回值的 fun 具有相同的类。默认指定fun 为 A = accumarray(subs,val,sz,fun,fillval) 提出的标值 fillval的元素 A 中,未涉及的任意行的 SUBS. 例如,如果 SUBS 是空的,那么 A 是 repmat(fillval,sz)。 fillval 和 fun 的返回值必须属于同一类。fillval 的默认值是 0。 A = accuma
4、rray(subs,val,sz,fun,fillval,issparse)创建一个数组 A,稀疏的标量输入的 issparse 是逻辑 1(即 true) , 或全如果 issparse等于逻辑 0(false) 。默认情况下是完整的. 如果 issparse 是 true,那么 fillval 必须是零或, val 和输出 fun 必须是 double。 .A = accumarray(subs1, subs2, ., val, .) 通过多个 SUBS 矢量在一个单元数组。您可以使用这个语法的四个的可选输入 (sz, fun, fillval,或 issparse ) 。 注意:如果,下
5、标在 subs 没有排序 fun 在其输入数据应该不依赖于该值的顺序。 函数处理的输入如下: 1. 了解如何在唯一索引有多少 SUBS。输出数组中的每一个唯一索引定义 容器。SUBS的大小决定了对输出数组的最大索引值。 2. 每个索引重复了多少次 这就决定了有多少个元素的 vals 将要积累在输出数组中的每个容器。 3. 创建一个输出数组。输出数组是尺寸 max(subs) 的大小 SZ。 4. 累积 vals 中的项目 使用 subs 的指数值,每个容器中的条目适用 fun。 5. 填充值没有引用 subs。默认的填充值是零;,使用 fillval 设置为不同的值 注:SUBS 应该包含正整
6、数。SUBS 与一个或多个元素,每个元素的向量的正整数,也可以是一个单元向量。所有的向量必须具有相同的长度。在这种情况下,SUBS 被视为的向量形成索引 matrix.val 的列必须是数字,逻辑的,或字符的矢量具有相同的长度作为 SUBS 中的行数。VAL 也可以是一个标量,其 SUBS 值重复 所有行 实例 例 1 创建一个 5-1 载体和重复的 1-D 下标的累计 值: val = 101:105;subs = 1; 2; 4; 2; 4subs =1 2 4 2 4 A = accumarray(subs, val)A =101 % A(1) = val(1) = 101206 % A
7、(2) = val(2)+val(4) = 102+104 = 2060 % A(3) = 0208 % A(4) = val(3)+val(5) = 103+105 = 208例 2创建一个 44 的矩阵,并减去重复的 2-D 下标值: val = 101:106;subs=1 2; 1 2; 3 1; 4 1; 4 4; 4 1;B = accumarray(subs,val,(x)sum(diff(x)B =0 -1 0 00 0 0 00 0 0 02 0 0 0下标的顺序的事项: val = 101:106;subs=1 2; 3 1; 1 2; 4 4; 4 1; 4 1;B1 =
8、 accumarray(subs,val,(x)sum(diff(x)B1 =0 -2 0 00 0 0 00 0 0 0-1 0 0 0例 3创建一个 232 的数组和重复 3-D 下标的累计值: val = 101:105;subs = 1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2;A = accumarray(subs, val)A(:,:,1) =101 0 00 0 0A(:,:,2) =0 0 0206 0 208例 4创建一个 2-3-2 的阵列,和本身的总和值: val = 101:105;subs = 1 1 1; 2 1 2; 2 3 2; 2 1 2
9、; 2 3 2;A = accumarray(subs, int8(val), , (x) sum(x,native)A(:,:,1) =101 0 00 0 0A(:,:,2) =0 0 0127 0 127class(A)ans =int8例 5通过多个在一个单元数组的下标参数。 1. 创建一个 12 元素的矢量 V: 2. V = 101:112;3. 创建三个 12 元向量,每个维度一个元素的阵列 A. 请注意,这些向量的指数如何确定的 V 元素累积在 A: 4. % index 1 index 6 = V(1)+V(6) = A(1,3,1)5. % | |6. rowsubs =
10、1 3 3 2 3 1 2 2 3 3 1 2;7. colsubs = 3 4 2 1 4 3 4 2 2 4 3 4;8. pagsubs = 1 1 2 2 1 1 2 1 1 1 2 2;9. % |10.% index 4 = V(4) = A(2,1,2)11.%12.% A(1,3,1) = V(1) + V(6) = 101 + 106 = 207% A(2,1,2) = V(4) = 10413. 调用 accumarray, 通过在一个单元数组下标向量: 14.A = accumarray(rowsubs colsubs pagsubs, V)15.A(:,:,1) =16
11、. 0 0 207 0 % A(1,3,1) is 20717. 0 108 0 018. 0 109 0 31719.A(:,:,2) =20. 0 0 111 021. 104 0 0 219 % A(2,1,2) is 1040 103 0 0例 6max 函数创建一个数组,该数组的所有元素为空,并填写 NaN: val = 101:105;subs = 1 1; 2 1; 2 3; 2 1; 2 3;A = accumarray(subs, val, 2 4, max, NaN)A =101 NaN NaN NaN104 NaN 105 NaN例 7创建一个稀疏矩阵使用 prod 函数
12、: val = 101:105;subs = 1 1; 2 1; 2 3; 2 1; 2 3;A = accumarray(subs, val, 2 4, prod, 0, true)A =(1,1) 101(2,1) 10608(2,3) 10815例 8数一数每个容器中积累的项目 val = 1;subs = 1 1; 2 1; 2 3; 2 1; 2 3;A = accumarray(subs, val, 2 4)A =1 0 0 02 0 2 0例 9创建一个逻辑阵列,垃圾桶会积累两个或多个值 val = 101:105;subs = 1 1; 2 1; 2 3; 2 1; 2 3;A = accumarray(subs, val, 2 4, (x) length(x) 1)A =0 0 0 01 0 1 0例 10组在一个单元数组的值: val = 101:105;subs = 1 1; 2 1; 2 3; 2 1; 2 3;A = accumarray(subs, val, 2 4, (x) x)A = 101 2x1 double 2x1 double A2ans =104102参见full | sparse | sum