Fork me on GitHub

accumarray

  1 Example 1
  2 
  3 
  4 Create a 5-by-1 vector and sum values for repeated 1-D subscripts:
  5 val = 101:105;
  6 subs = [1; 2; 4; 2; 4]
  7 subs =
  8      1 
  9      2 
 10      4 
 11      2 
 12      4 
 13 
 14 A = accumarray(subs, val)
 15 A =
 16    101       % A(1) = val(1) = 101
 17    206       % A(2) = val(2)+val(4) = 102+104 = 206
 18      0       % A(3) = 0
 19    208       % A(4) = val(3)+val(5) = 103+105 = 208
 20 
 21 
 22     0     0
 23      0     0     0     0
 24      0     0     0     0
 25      2     0     0     0
 26 
 27 
 28 The order of the subscripts matters:
 29 val = 101:106;
 30 subs=[1 2; 3 1; 1 2; 4 4; 4 1; 4 1];
 31 B1 = accumarray(subs,val,[],@(x)sum(diff(x)))
 32 
 33 B1 =
 34 
 35      0    -2     0     0
 36      0     0     0     0
 37      0     0     0     0
 38     -1     0     0     0
 39 
 40 
 41 Example 3
 42 
 43 
 44 Create a 2-by-3-by-2 array and sum values for repeated 3-D subscripts:
 45 val = 101:105;
 46 subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2];
 47 
 48 A = accumarray(subs, val)
 49 A(:,:,1) =
 50    101     0     0
 51      0     0     0
 52 A(:,:,2) =
 53      0     0     0
 54    206     0   208
 55 
 56 Example 4
 57 
 58 
 59 Create a 2-by-3-by-2 array, and sum values natively:
 60 val = 101:105;
 61 subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2];
 62 
 63 A = accumarray(subs, int8(val), [], @(x) sum(x,'native'))
 64 A(:,:,1) =
 65   101    0    0
 66     0    0    0
 67 A(:,:,2) =
 68     0    0    0
 69   127    0  127
 70 
 71 class(A)
 72 ans =
 73     int8
 74 
 75 Example 5
 76 
 77 
 78 Pass multiple subscript arguments in a cell array.
 79 
 80 Create a 12-element vector V:
 81 V = 101:112;
 82 
 83 
 84 
 85 Create three 12-element vectors, one for each dimension of the resulting array A. Note how the indices of these vectors determine which elements of V are accumulated in A:
 86 %        index 1   index 6 => V(1)+V(6) => A(1,3,1)
 87 %          |         |
 88 rowsubs = [1 3 3 2 3 1 2 2 3 3 1 2];
 89 colsubs = [3 4 2 1 4 3 4 2 2 4 3 4];
 90 pagsubs = [1 1 2 2 1 1 2 1 1 1 2 2];
 91 %                |
 92 %              index 4 => V(4) => A(2,1,2)
 93 %
 94 % A(1,3,1) = V(1) + V(6) = 101 + 106 = 207
 95 % A(2,1,2) = V(4) = 104
 96 
 97 
 98 Call accumarray, passing the subscript vectors in a cell array:
 99 A = accumarray({rowsubs colsubs pagsubs}, V)
100 A(:,:,1) =
101      0     0   207     0        % A(1,3,1) is 207
102      0   108     0     0
103      0   109     0   317
104 A(:,:,2) =
105      0     0   111     0
106    104     0     0   219        % A(2,1,2) is 104
107      0   103     0     0
108 
109 Example 6
110 
111 
112 Create an array with the max function, and fill all empty elements of that array with NaN:
113 val = 101:105;
114 subs = [1 1; 2 1; 2 3; 2 1; 2 3];
115 
116 A = accumarray(subs, val, [2 4], @max, NaN)
117 A =
118    101   NaN   NaN   NaN
119    104   NaN   105   NaN
120 
121 Example 7
122 
123 
124 Create a sparse matrix using the prod function:
125 val = 101:105;
126 subs = [1 1; 2 1; 2 3; 2 1; 2 3];
127 
128 A = accumarray(subs, val, [2 4], @prod, 0, true)
129 A =
130    (1,1)            101
131    (2,1)          10608
132    (2,3)          10815
133 
134 
135 Example 8
136 
137 
138 Count the number of entries accumulated in each bin:
139 val = 1;
140 subs = [1 1; 2 1; 2 3; 2 1; 2 3];
141 
142 A = accumarray(subs, val, [2 4])
143 A =
144      1     0     0     0
145      2     0     2     0
146 
147 Example 9
148 
149 
150 Create a logical array that shows which bins will accumulate two or more values:
151 val = 101:105;
152 subs = [1 1; 2 1; 2 3; 2 1; 2 3];
153 
154 A = accumarray(subs, val, [2 4], @(x) length(x) > 1)
155 A =
156      0     0     0     0
157      1     0     1     0
158 
159 Example 10
160 
161 
162 Group values in a cell array:
163 val = 101:105;
164 subs = [1 1; 2 1; 2 3; 2 1; 2 3];
165 
166 A = accumarray(subs, val, [2 4], @(x) {x})
167 A = 
168     [       101]     []              []     []
169     [2x1 double]     []    [2x1 double]     []
170 
171 A{2}
172 ans =
173    104
174    102
Examples

 

posted @ 2015-05-16 12:22  小奔奔  阅读(177)  评论(0编辑  收藏  举报