资源描述
accumarray
构造与积累的阵列
语法
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和索引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的每个子集的元素的val. 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 = accumarray(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 )。
注意:如果,下标在subs没有排序 fun 在其输入数据应该不依赖于该值的顺序。
函数处理的输入如下:
1. 了解如何在唯一索引有多少SUBS。输出数组中的每一个唯一索引定义容器。SUBS的大小决定了对输出数组的最大索引值。
2. 每个索引重复了多少次
这就决定了有多少个元素的vals将要积累在输出数组中的每个容器。
3. 创建一个输出数组。输出数组是尺寸max(subs) 的大小SZ。
4. 累积vals中的项目 使用subs的指数值,每个容器中的条目适用fun。
5. 填充值没有引用subs。默认的填充值是零;,使用fillval设置为不同的值
注:SUBS应该包含正整数。SUBS与一个或多个元素,每个元素的向量的正整数,也可以是一个单元向量。所有的向量必须具有相同的长度。在这种情况下,SUBS被视为的向量形成索引matrix.val的列必须是数字,逻辑的,或字符的矢量具有相同的长度作为SUBS中的行数。VAL也可以是一个标量,其SUBS值重复 所有行
实例
例1
创建一个5-1载体和重复的1-D下标的累计 值:
val = 101:105;
subs = [1; 2; 4; 2; 4]
subs =
1
2
4
2
4
A = accumarray(subs, val)
A =
101 % A(1) = val(1) = 101
206 % A(2) = val(2)+val(4) = 102+104 = 206
0 % A(3) = 0
208 % A(4) = val(3)+val(5) = 103+105 = 208
例 2
创建一个4×4的矩阵,并减去重复的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 0
0 0 0 0
0 0 0 0
2 0 0 0
下标的顺序的事项:
val = 101:106;
subs=[1 2; 3 1; 1 2; 4 4; 4 1; 4 1];
B1 = accumarray(subs,val,[],@(x)sum(diff(x)))
B1 =
0 -2 0 0
0 0 0 0
0 0 0 0
-1 0 0 0
例 3
创建一个2×3×2的数组和重复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 0
0 0 0
A(:,:,2) =
0 0 0
206 0 208
例 4
创建一个2-3-2的阵列,和本身的总和值:
val = 101:105;
subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2];
A = accumarray(subs, int8(val), [], @(x) sum(x,'native'))
A(:,:,1) =
101 0 0
0 0 0
A(:,:,2) =
0 0 0
127 0 127
class(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 = [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) = 104
13. 调用 accumarray, 通过在一个单元数组下标向量:
14. A = accumarray({rowsubs colsubs pagsubs}, V)
15. A(:,:,1) =
16. 0 0 207 0 % A(1,3,1) is 207
17. 0 108 0 0
18. 0 109 0 317
19. A(:,:,2) =
20. 0 0 111 0
21. 104 0 0 219 % A(2,1,2) is 104
0 103 0 0
例 6
max函数创建一个数组,该数组的所有元素为空,并填写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 NaN
104 NaN 105 NaN
例 7
创建一个稀疏矩阵使用prod函数:
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 0
2 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 0
1 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] []
A{2}
ans =
104
102
参见
full | sparse | sum
展开阅读全文