Mercurial > octave
annotate scripts/general/accumarray.m @ 26056:df3f2e119944
Expand intmax/intmin to accept an integer variable as input.
* bitfcns.cc (Fintmax, Fintmin): Redo docstring to document new calling form.
Add Example Code to documentation showing how to call function with an integer
variable as input. Use isinteger() to check for an integer input and call
class_name() to find the class of variable. Redo BIST tests.
* accumarray.m, image.m, ind2x.m, rgb2ind.m: Replace instances of
"intmax (class (x))" with just "intmax (x)". Ditto for intmin.
author | Rik <rik@octave.org> |
---|---|
date | Sat, 10 Nov 2018 21:42:43 -0800 |
parents | 6652d3823428 |
children | 00f796120a6d |
rev | line source |
---|---|
25054
6652d3823428
maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents:
24534
diff
changeset
|
1 ## Copyright (C) 2007-2018 David Bateman |
11523 | 2 ## Copyright (C) 2009-2010 VZLU Prague |
6770 | 3 ## |
7016 | 4 ## This file is part of Octave. |
6770 | 5 ## |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
24266
diff
changeset
|
6 ## Octave is free software: you can redistribute it and/or modify it |
7016 | 7 ## under the terms of the GNU General Public License as published by |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
24266
diff
changeset
|
8 ## the Free Software Foundation, either version 3 of the License, or |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22489
diff
changeset
|
9 ## (at your option) any later version. |
7016 | 10 ## |
11 ## Octave is distributed in the hope that it will be useful, but | |
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22489
diff
changeset
|
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22489
diff
changeset
|
14 ## GNU General Public License for more details. |
6770 | 15 ## |
16 ## You should have received a copy of the GNU General Public License | |
7016 | 17 ## along with Octave; see the file COPYING. If not, see |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
24266
diff
changeset
|
18 ## <https://www.gnu.org/licenses/>. |
6770 | 19 |
20 ## -*- texinfo -*- | |
20852
516bb87ea72e
2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents:
20158
diff
changeset
|
21 ## @deftypefn {} {} accumarray (@var{subs}, @var{vals}, @var{sz}, @var{func}, @var{fillval}, @var{issparse}) |
516bb87ea72e
2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents:
20158
diff
changeset
|
22 ## @deftypefnx {} {} accumarray (@var{subs}, @var{vals}, @dots{}) |
6770 | 23 ## |
7186 | 24 ## Create an array by accumulating the elements of a vector into the |
20158
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19865
diff
changeset
|
25 ## positions defined by their subscripts. |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19865
diff
changeset
|
26 ## |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19865
diff
changeset
|
27 ## The subscripts are defined by the rows of the matrix @var{subs} and the |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19865
diff
changeset
|
28 ## values by @var{vals}. Each row of @var{subs} corresponds to one of the |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19865
diff
changeset
|
29 ## values in @var{vals}. If @var{vals} is a scalar, it will be used for each |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19865
diff
changeset
|
30 ## of the row of @var{subs}. If @var{subs} is a cell array of vectors, all |
7503499a252b
doc: Update docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19865
diff
changeset
|
31 ## vectors must be of the same length, and the subscripts in the @var{k}th |
14113
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
32 ## vector must correspond to the @var{k}th dimension of the result. |
6770 | 33 ## |
13152
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
34 ## The size of the matrix will be determined by the subscripts |
14119
94e2a76f1e5a
doc: Final grammarcheck and spellcheck before 3.6.0 release.
Rik <octave@nomad.inbox5.com>
parents:
14115
diff
changeset
|
35 ## themselves. However, if @var{sz} is defined it determines the matrix |
94e2a76f1e5a
doc: Final grammarcheck and spellcheck before 3.6.0 release.
Rik <octave@nomad.inbox5.com>
parents:
14115
diff
changeset
|
36 ## size. The length of @var{sz} must correspond to the number of columns |
13929
9cae456085c2
Grammarcheck of documentation before 3.6.0 release.
Rik <octave@nomad.inbox5.com>
parents:
13788
diff
changeset
|
37 ## in @var{subs}. An exception is if @var{subs} has only one column, in |
14115
0b3518c1228a
acumarray.m: Reformat long lines
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14114
diff
changeset
|
38 ## which case @var{sz} may be the dimensions of a vector and the |
0b3518c1228a
acumarray.m: Reformat long lines
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14114
diff
changeset
|
39 ## subscripts of @var{subs} are taken as the indices into it. |
6770 | 40 ## |
13152
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
41 ## The default action of @code{accumarray} is to sum the elements with |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
42 ## the same subscripts. This behavior can be modified by defining the |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
43 ## @var{func} function. This should be a function or function handle |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
44 ## that accepts a column vector and returns a scalar. The result of the |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
45 ## function should not depend on the order of the subscripts. |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
46 ## |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
47 ## The elements of the returned array that have no subscripts associated |
13929
9cae456085c2
Grammarcheck of documentation before 3.6.0 release.
Rik <octave@nomad.inbox5.com>
parents:
13788
diff
changeset
|
48 ## with them are set to zero. Defining @var{fillval} to some other value |
13931
9de488c6c59c
doc: Spellcheck documentation before 3.6.0 release
Rik <octave@nomad.inbox5.com>
parents:
13929
diff
changeset
|
49 ## allows these values to be defined. This behavior changes, however, |
24264
ec4ec2f7029d
accumarray.m: Add '@' to function handles in docstring (bug #52418).
Rik <rik@octave.org>
parents:
23219
diff
changeset
|
50 ## for certain values of @var{func}. If @var{func} is @code{@@min} |
ec4ec2f7029d
accumarray.m: Add '@' to function handles in docstring (bug #52418).
Rik <rik@octave.org>
parents:
23219
diff
changeset
|
51 ## (respectively, @code{@@max}) then the result will be filled with the |
13787
8bb7bdbe9c69
Clarify max/min in accumarray and uniformise its behaviour
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13175
diff
changeset
|
52 ## minimum (respectively, maximum) integer if @var{vals} is of integral |
8bb7bdbe9c69
Clarify max/min in accumarray and uniformise its behaviour
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13175
diff
changeset
|
53 ## type, logical false (respectively, logical true) if @var{vals} is of |
8bb7bdbe9c69
Clarify max/min in accumarray and uniformise its behaviour
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13175
diff
changeset
|
54 ## logical type, zero if @var{fillval} is zero and all values are |
13931
9de488c6c59c
doc: Spellcheck documentation before 3.6.0 release
Rik <octave@nomad.inbox5.com>
parents:
13929
diff
changeset
|
55 ## non-positive (respectively, non-negative), and NaN otherwise. |
6770 | 56 ## |
13152
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
57 ## By default @code{accumarray} returns a full matrix. If |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
58 ## @var{issparse} is logically true, then a sparse matrix is returned |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
59 ## instead. |
6770 | 60 ## |
13152
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
61 ## The following @code{accumarray} example constructs a frequency table |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
62 ## that in the first column counts how many occurrences each number in |
13929
9cae456085c2
Grammarcheck of documentation before 3.6.0 release.
Rik <octave@nomad.inbox5.com>
parents:
13788
diff
changeset
|
63 ## the second column has, taken from the vector @var{x}. Note the usage |
13152
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
64 ## of @code{unique} for assigning to all repeated elements of @var{x} |
17097
e7a059a9a644
doc: Use XREF as anchor prefix in documentation for clearer results in Info viewer.
Rik <rik@octave.org>
parents:
16772
diff
changeset
|
65 ## the same index (@pxref{XREFunique,,unique}). |
6770 | 66 ## |
67 ## @example | |
68 ## @group | |
14122
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
69 ## @var{x} = [91, 92, 90, 92, 90, 89, 91, 89, 90, 100, 100, 100]; |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
70 ## [@var{u}, ~, @var{j}] = unique (@var{x}); |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
71 ## [accumarray(@var{j}', 1), @var{u}'] |
14327
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
72 ## @result{} 2 89 |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
73 ## 3 90 |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
74 ## 2 91 |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
75 ## 2 92 |
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
76 ## 3 100 |
13152
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
77 ## @end group |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
78 ## @end example |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
79 ## |
13929
9cae456085c2
Grammarcheck of documentation before 3.6.0 release.
Rik <octave@nomad.inbox5.com>
parents:
13788
diff
changeset
|
80 ## Another example, where the result is a multi-dimensional 3-D array and |
13152
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
81 ## the default value (zero) appears in the output: |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
82 ## |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
83 ## @example |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
84 ## @group |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
85 ## accumarray ([1, 1, 1; |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
86 ## 2, 1, 2; |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
87 ## 2, 3, 2; |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
88 ## 2, 1, 2; |
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
89 ## 2, 3, 2], 101:105) |
6770 | 90 ## @result{} ans(:,:,1) = [101, 0, 0; 0, 0, 0] |
14327
4d917a6a858b
doc: Use Octave coding conventions in @example blocks of docstrings.
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
91 ## @result{} ans(:,:,2) = [0, 0, 0; 206, 0, 208] |
6770 | 92 ## @end group |
93 ## @end example | |
10275
19f2107d1fdd
document accumarray complexity
Jaroslav Hajek <highegg@gmail.com>
parents:
10274
diff
changeset
|
94 ## |
14122
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
95 ## The sparse option can be used as an alternative to the @code{sparse} |
17097
e7a059a9a644
doc: Use XREF as anchor prefix in documentation for clearer results in Info viewer.
Rik <rik@octave.org>
parents:
16772
diff
changeset
|
96 ## constructor (@pxref{XREFsparse,,sparse}). Thus |
14122
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
97 ## |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
98 ## @example |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
99 ## sparse (@var{i}, @var{j}, @var{sv}) |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
100 ## @end example |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
101 ## |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
102 ## @noindent |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
103 ## can be written with @code{accumarray} as |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
104 ## |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
105 ## @example |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
106 ## accumarray ([@var{i}, @var{j}], @var{sv}', [], [], 0, true) |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
107 ## @end example |
13152
8d5f0b41e6b0
Improve accumarray's docstring: one more example, mention vals can be scalar
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
12214
diff
changeset
|
108 ## |
14122
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
109 ## @noindent |
14366
b76f0740940e
doc: Periodic grammar check of documentation.
Rik <octave@nomad.inbox5.com>
parents:
14363
diff
changeset
|
110 ## For repeated indices, @code{sparse} adds the corresponding value. To |
14124
4b07db9dd976
accumarray.m: Fix trivial typo in docstring.
Ben Abbott <bpabbott@mac.com>
parents:
14122
diff
changeset
|
111 ## take the minimum instead, use @code{min} as an accumulator function: |
14122
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
112 ## |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
113 ## @example |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
114 ## accumarray ([@var{i}, @var{j}], @var{sv}', [], @@min, 0, true) |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
115 ## @end example |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
116 ## |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
117 ## The complexity of accumarray in general for the non-sparse case is |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
118 ## generally O(M+N), where N is the number of subscripts and M is the |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
119 ## maximum subscript (linearized in multi-dimensional case). If |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
120 ## @var{func} is one of @code{@@sum} (default), @code{@@max}, |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
121 ## @code{@@min} or @code{@@(x) @{x@}}, an optimized code path is used. |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
122 ## Note that for general reduction function the interpreter overhead can |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
123 ## play a major part and it may be more efficient to do multiple |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
124 ## accumarray calls and compute the results in a vectorized manner. |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
125 ## |
c299bb9f0ad0
accumarray.m: Add another example for sparse matrices, minor formatting
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14119
diff
changeset
|
126 ## @seealso{accumdim, unique, sparse} |
6770 | 127 ## @end deftypefn |
128 | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
129 function A = accumarray (subs, vals, sz = [], func = [], fillval = [], issparse = []) |
6770 | 130 |
131 if (nargin < 2 || nargin > 6) | |
132 print_usage (); | |
133 endif | |
134 | |
14113
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
135 lenvals = length (vals); |
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
136 |
7186 | 137 if (iscell (subs)) |
14113
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
138 subs = cellfun (@vec, subs, "uniformoutput", false); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
139 ndims = numel (subs); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
140 if (ndims == 1) |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
141 subs = subs{1}; |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
142 endif |
14113
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
143 |
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
144 lensubs = cellfun (@length, subs); |
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
145 |
19865
e9f89866074c
maint: Cleanup some .m files to follow Octave coding conventions.
John W. Eaton <jwe@octave.org>
parents:
19700
diff
changeset
|
146 if (any (lensubs != lensubs(1)) || (lenvals > 1 && lenvals != lensubs(1))) |
14113
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
147 error ("accumarray: dimension mismatch"); |
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
148 endif |
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
149 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
150 else |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
151 ndims = columns (subs); |
14113
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
152 if (lenvals > 1 && lenvals != rows (subs)) |
15202
f3b5cadfd6d5
fix missing semicolons in various .m files
John W. Eaton <jwe@octave.org>
parents:
14868
diff
changeset
|
153 error ("accumarray: dimension mismatch"); |
14113
dac62c415e8b
Do more error checking on accumarray and accumdim input.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14062
diff
changeset
|
154 endif |
6770 | 155 endif |
156 | |
23493
bf063fafeca5
accumarray.m: check if func is a function handle
Carnë Draug <carandraug@octave.org>
parents:
23220
diff
changeset
|
157 if (isempty (func)) |
bf063fafeca5
accumarray.m: check if func is a function handle
Carnë Draug <carandraug@octave.org>
parents:
23220
diff
changeset
|
158 func = @sum; |
bf063fafeca5
accumarray.m: check if func is a function handle
Carnë Draug <carandraug@octave.org>
parents:
23220
diff
changeset
|
159 elseif (! is_function_handle (func)) |
bf063fafeca5
accumarray.m: check if func is a function handle
Carnë Draug <carandraug@octave.org>
parents:
23220
diff
changeset
|
160 error ("accumarray: FUNC must be a function handle"); |
bf063fafeca5
accumarray.m: check if func is a function handle
Carnë Draug <carandraug@octave.org>
parents:
23220
diff
changeset
|
161 endif |
bf063fafeca5
accumarray.m: check if func is a function handle
Carnë Draug <carandraug@octave.org>
parents:
23220
diff
changeset
|
162 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
163 if (isempty (fillval)) |
6770 | 164 fillval = 0; |
165 endif | |
166 | |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
167 if (isempty (issparse)) |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
168 issparse = false; |
6770 | 169 endif |
7186 | 170 |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
171 if (issparse) |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
172 |
21751
b571fc85953f
maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents:
21580
diff
changeset
|
173 ## Sparse case. |
b571fc85953f
maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents:
21580
diff
changeset
|
174 ## Avoid linearizing the subscripts, because it could overflow. |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
175 |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
176 if (fillval != 0) |
11472
1740012184f9
Use uppercase for variable names in error() strings to match Info documentation. Only m-files done.
Rik <octave@nomad.inbox5.com>
parents:
11469
diff
changeset
|
177 error ("accumarray: FILLVAL must be zero in the sparse case"); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
178 endif |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
179 |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
180 ## Ensure subscripts are a two-column matrix. |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
181 if (iscell (subs)) |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
182 subs = [subs{:}]; |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
183 endif |
6770 | 184 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
185 ## Validate dimensions. |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
186 if (ndims == 1) |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
187 subs(:,2) = 1; |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
188 elseif (ndims != 2) |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
189 error ("accumarray: in the sparse case, needs 1 or 2 subscripts"); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
190 endif |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
191 |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
192 if (isnumeric (vals) || islogical (vals)) |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
193 vals = double (vals); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
194 else |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
195 error ("accumarray: in the sparse case, values must be numeric or logical"); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
196 endif |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
197 |
23493
bf063fafeca5
accumarray.m: check if func is a function handle
Carnë Draug <carandraug@octave.org>
parents:
23220
diff
changeset
|
198 if (func != @sum) |
8934
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
199 |
21751
b571fc85953f
maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents:
21580
diff
changeset
|
200 ## Reduce values. This is not needed if we're about to sum them, |
14115
0b3518c1228a
acumarray.m: Reformat long lines
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14114
diff
changeset
|
201 ## because "sparse" can do that. |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
202 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
203 ## Sort indices. |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
204 [subs, idx] = sortrows (subs); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
205 n = rows (subs); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
206 ## Identify runs. |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
207 jdx = find (any (diff (subs, 1, 1), 2)); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
208 jdx = [jdx; n]; |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
209 |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
210 vals = cellfun (func, mat2cell (vals(:)(idx), diff ([0; jdx]))); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
211 subs = subs(jdx, :); |
10283
b178769f31ca
more small improvements in accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
10277
diff
changeset
|
212 mode = "unique"; |
b178769f31ca
more small improvements in accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
10277
diff
changeset
|
213 else |
b178769f31ca
more small improvements in accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
10277
diff
changeset
|
214 mode = "sum"; |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
215 endif |
8934
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
216 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
217 ## Form the sparse matrix. |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
218 if (isempty (sz)) |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
219 A = sparse (subs(:,1), subs(:,2), vals, mode); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
220 elseif (length (sz) == 2) |
13788
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
221 |
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
222 ## Row vector case |
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
223 if (sz(1) == 1) |
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
224 [i, j] = deal (subs(:,2), subs(:,1)); |
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
225 else |
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
226 [i, j] = deal (subs(:,1), subs(:,2)); |
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
227 endif |
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
228 A = sparse (i, j, vals, sz(1), sz(2), mode); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
229 else |
11589
b0084095098e
missing semicolons in script files
John W. Eaton <jwe@octave.org>
parents:
11587
diff
changeset
|
230 error ("accumarray: dimensions mismatch"); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
231 endif |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
232 |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
233 else |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
234 |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
235 ## Linearize subscripts. |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
236 if (ndims > 1) |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
237 if (isempty (sz)) |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
238 if (iscell (subs)) |
12931
cefd568ea073
Replace function handles with function names in cellfun calls for 15% speedup.
Rik <octave@nomad.inbox5.com>
parents:
12214
diff
changeset
|
239 sz = cellfun ("max", subs); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
240 else |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
241 sz = max (subs, [], 1); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
242 endif |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
243 elseif (ndims != length (sz)) |
11589
b0084095098e
missing semicolons in script files
John W. Eaton <jwe@octave.org>
parents:
11587
diff
changeset
|
244 error ("accumarray: dimensions mismatch"); |
8934
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
245 endif |
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
246 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
247 ## Convert multidimensional subscripts. |
19700
00e31f316a3a
Fix Matlab incompatibility of "ismatrix" (bug #42422).
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
19697
diff
changeset
|
248 if (isnumeric (subs)) |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
249 subs = num2cell (subs, 1); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
250 endif |
10274
db613bccd992
take advantage of new sort optimization in accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
10271
diff
changeset
|
251 subs = sub2ind (sz, subs{:}); # creates index cache |
10271
297996005012
1 more small fix in accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
10269
diff
changeset
|
252 elseif (! isempty (sz) && length (sz) < 2) |
10269
217d36560dfa
small fixes to accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
10268
diff
changeset
|
253 error ("accumarray: needs at least 2 dimensions"); |
10274
db613bccd992
take advantage of new sort optimization in accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
10271
diff
changeset
|
254 elseif (! isindex (subs)) # creates index cache |
db613bccd992
take advantage of new sort optimization in accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
10271
diff
changeset
|
255 error ("accumarray: indices must be positive integers"); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
256 endif |
8934
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
257 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
258 |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
259 ## Some built-in reductions handled efficiently. |
8934
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
260 |
23493
bf063fafeca5
accumarray.m: check if func is a function handle
Carnë Draug <carandraug@octave.org>
parents:
23220
diff
changeset
|
261 if (func == @sum) |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
262 ## Fast summation. |
8934
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
263 if (isempty (sz)) |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
264 A = __accumarray_sum__ (subs, vals); |
8934
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
265 else |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
266 A = __accumarray_sum__ (subs, vals, prod (sz)); |
8934
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
267 ## set proper shape. |
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
268 A = reshape (A, sz); |
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
269 endif |
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
270 |
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
271 ## we fill in nonzero fill value. |
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
272 if (fillval != 0) |
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
273 mask = true (size (A)); |
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
274 mask(subs) = false; |
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
275 A(mask) = fillval; |
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
276 endif |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
277 elseif (func == @max) |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
278 ## Fast maximization. |
8934
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
279 |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
280 if (isinteger (vals)) |
26056
df3f2e119944
Expand intmax/intmin to accept an integer variable as input.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
281 zero = intmin (vals); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
282 elseif (islogical (vals)) |
10269
217d36560dfa
small fixes to accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
10268
diff
changeset
|
283 zero = false; |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
284 elseif (fillval == 0 && all (vals(:) >= 0)) |
14115
0b3518c1228a
acumarray.m: Reformat long lines
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14114
diff
changeset
|
285 ## This is a common case - fillval is zero, all numbers |
0b3518c1228a
acumarray.m: Reformat long lines
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14114
diff
changeset
|
286 ## nonegative. |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
287 zero = 0; |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
288 else |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
289 zero = NaN; # Neutral value. |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
290 endif |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
291 |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
292 if (isempty (sz)) |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
293 A = __accumarray_max__ (subs, vals, zero); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
294 else |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
295 A = __accumarray_max__ (subs, vals, zero, prod (sz)); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
296 A = reshape (A, sz); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
297 endif |
8934
c2099a4d12ea
partially optimize accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
298 |
10775 | 299 if (fillval != zero && ! (isnan (fillval) || isnan (zero))) |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
300 mask = true (size (A)); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
301 mask(subs) = false; |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
302 A(mask) = fillval; |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
303 endif |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
304 elseif (func == @min) |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
305 ## Fast minimization. |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
306 |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
307 if (isinteger (vals)) |
26056
df3f2e119944
Expand intmax/intmin to accept an integer variable as input.
Rik <rik@octave.org>
parents:
25054
diff
changeset
|
308 zero = intmax (vals); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
309 elseif (islogical (vals)) |
10269
217d36560dfa
small fixes to accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
10268
diff
changeset
|
310 zero = true; |
13787
8bb7bdbe9c69
Clarify max/min in accumarray and uniformise its behaviour
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13175
diff
changeset
|
311 elseif (fillval == 0 && all (vals(:) <= 0)) |
14115
0b3518c1228a
acumarray.m: Reformat long lines
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14114
diff
changeset
|
312 ## This is a common case - fillval is zero, all numbers |
0b3518c1228a
acumarray.m: Reformat long lines
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14114
diff
changeset
|
313 ## non-positive. |
13787
8bb7bdbe9c69
Clarify max/min in accumarray and uniformise its behaviour
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13175
diff
changeset
|
314 zero = 0; |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
315 else |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
316 zero = NaN; # Neutral value. |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
317 endif |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
318 |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
319 if (isempty (sz)) |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
320 A = __accumarray_min__ (subs, vals, zero); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
321 else |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
322 A = __accumarray_min__ (subs, vals, zero, prod (sz)); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
323 A = reshape (A, sz); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
324 endif |
8820
89b95972e178
fix previously introduced problem in octave_sort, improve design
Jaroslav Hajek <highegg@gmail.com>
parents:
8507
diff
changeset
|
325 |
10775 | 326 if (fillval != zero && ! (isnan (fillval) || isnan (zero))) |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
327 mask = true (size (A)); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
328 mask(subs) = false; |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
329 A(mask) = fillval; |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
330 endif |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
331 else |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
332 |
21751
b571fc85953f
maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents:
21580
diff
changeset
|
333 ## The general case. Reduce values. |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
334 n = rows (subs); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
335 if (numel (vals) == 1) |
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
336 vals = vals(ones (1, n), 1); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
337 else |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
338 vals = vals(:); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
339 endif |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
340 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
341 ## Sort indices. |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
342 [subs, idx] = sort (subs); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
343 ## Identify runs. |
10283
b178769f31ca
more small improvements in accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
10277
diff
changeset
|
344 jdx = find (subs(1:n-1) != subs(2:n)); |
21401
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
345 if (n != 0) # bug #47287 |
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
346 jdx = [jdx; n]; |
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
347 endif |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
348 vals = mat2cell (vals(idx), diff ([0; jdx])); |
21751
b571fc85953f
maint: Use two spaces after period to indicate sentence break.
Rik <rik@octave.org>
parents:
21580
diff
changeset
|
349 ## Optimize the case when function is @(x) {x}, i.e., we just want |
14115
0b3518c1228a
acumarray.m: Reformat long lines
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14114
diff
changeset
|
350 ## to collect the values to cells. |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
351 persistent simple_cell_str = func2str (@(x) {x}); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
352 if (! strcmp (func2str (func), simple_cell_str)) |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
353 vals = cellfun (func, vals); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
354 endif |
21401
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
355 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
356 subs = subs(jdx); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
357 |
14114
da67f032a712
accumarray.m: Handle the case of empty size argument for functions besides @sum
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14113
diff
changeset
|
358 if (isempty (sz)) |
da67f032a712
accumarray.m: Handle the case of empty size argument for functions besides @sum
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14113
diff
changeset
|
359 sz = max (subs); |
21402
8cfc50637511
accumarray: fix default output size for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21401
diff
changeset
|
360 ## If subs is empty, sz will be too, and length will be 0, hence "<= 1" |
8cfc50637511
accumarray: fix default output size for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21401
diff
changeset
|
361 if (length (sz) <= 1) |
14114
da67f032a712
accumarray.m: Handle the case of empty size argument for functions besides @sum
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14113
diff
changeset
|
362 sz(2) = 1; |
da67f032a712
accumarray.m: Handle the case of empty size argument for functions besides @sum
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14113
diff
changeset
|
363 endif |
da67f032a712
accumarray.m: Handle the case of empty size argument for functions besides @sum
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14113
diff
changeset
|
364 endif |
da67f032a712
accumarray.m: Handle the case of empty size argument for functions besides @sum
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
14113
diff
changeset
|
365 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
366 ## Construct matrix of fillvals. |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
367 if (iscell (vals)) |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
368 A = cell (sz); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
369 elseif (fillval == 0) |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
370 A = zeros (sz, class (vals)); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
371 else |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
372 A = repmat (fillval, sz); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
373 endif |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
374 |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
375 ## Set the reduced values. |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
376 A(subs) = vals; |
6770 | 377 endif |
378 endif | |
21758
ffad2baa90f7
maint: Use newlines to make code more readable.
Rik <rik@octave.org>
parents:
21751
diff
changeset
|
379 |
6770 | 380 endfunction |
381 | |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
382 |
21400
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
383 %!assert (accumarray ([1; 2; 4; 2; 4], 101:105), [101; 206; 0; 208]) |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
384 %!assert (accumarray ([1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2], 101:105), |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
385 %! cat (3, [101 0 0; 0 0 0], [0 0 0; 206 0 208])) |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
386 |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
387 %!assert (accumarray ([1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2], 101:105, [], @(x) sin (sum (x))), |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
388 %! sin (cat (3, [101,0,0;0,0,0],[0,0,0;206,0,208]))) |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
389 |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
390 %!assert (accumarray ({[1 3 3 2 3 1 2 2 3 3 1 2], [3 4 2 1 4 3 4 2 2 4 3 4], [1 1 2 2 1 1 2 1 1 1 2 2]}, 101:112), |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
391 %! cat (3, [0 0 207 0; 0 108 0 0; 0 109 0 317], [0 0 111 0; 104 0 0 219; 0 103 0 0])) |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
392 |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
393 %!assert (accumarray ([1 1; 2 1; 2 3; 2 1; 2 3], 101:105, [2 4], @max, NaN), |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
394 %! [101 NaN NaN NaN; 104 NaN 105 NaN]) |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
395 |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
396 %!assert (accumarray ([1 1; 2 1; 2 3; 2 1; 2 3], 101:105, [], @prod), |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
397 %! [101 0 0; 10608 0 10815]) |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
398 %!assert (accumarray ([1 1; 2 1; 2 3; 2 1; 2 3], 101:105, [2 4], @prod, 0, true), |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
399 %! sparse ([1 2 2], [1 1 3], [101 10608 10815], 2, 4)) |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
400 %!assert (accumarray ([1 1; 2 1; 2 3; 2 1; 2 3], 1, [2 4]), [1 0 0 0; 2 0 2 0]) |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
401 %!assert (accumarray ([1 1; 2 1; 2 3; 2 1; 2 3], 101:105, [2 4], @(x) length (x) > 1), |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
402 %! [false false false false; true false true false]) |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
403 |
13788
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
404 %!assert (accumarray ([1; 2], [3; 4], [2, 1], @min, [], 0), [3; 4]) |
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
405 %!assert (accumarray ([1; 2], [3; 4], [2, 1], @min, [], 1), sparse ([3; 4])) |
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
406 %!assert (accumarray ([1; 2], [3; 4], [1, 2], @min, [], 0), [3, 4]) |
9ab64f063c96
Consistently allow creation of sparse vectors in accumarray
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
13787
diff
changeset
|
407 %!assert (accumarray ([1; 2], [3; 4], [1, 2], @min, [], 1), sparse ([3, 4])) |
21400
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
408 |
6770 | 409 %!test |
21400
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
410 %! A = accumarray ([1 1; 2 1; 2 3; 2 1; 2 3], 101:105, [2,4], @(x) {x}); |
21580
ecce63c99c3f
maint: Add semicolons to terminate code in %! blocks.
Rik <rik@octave.org>
parents:
21402
diff
changeset
|
411 %! assert (A{2},[102; 104]); |
21400
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
412 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
413 %!test |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
414 %! subs = ceil (rand (2000, 3)*10); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
415 %! vals = rand (2000, 1); |
21400
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
416 %! assert (accumarray (subs, vals, [], @max), |
21580
ecce63c99c3f
maint: Add semicolons to terminate code in %! blocks.
Rik <rik@octave.org>
parents:
21402
diff
changeset
|
417 %! accumarray (subs, vals, [], @(x) max (x))); |
21400
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
418 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
419 %!test |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
420 %! subs = ceil (rand (2000, 1)*100); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
421 %! vals = rand (2000, 1); |
21400
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
422 %! assert (accumarray (subs, vals, [100, 1], @min, NaN), |
21580
ecce63c99c3f
maint: Add semicolons to terminate code in %! blocks.
Rik <rik@octave.org>
parents:
21402
diff
changeset
|
423 %! accumarray (subs, vals, [100, 1], @(x) min (x), NaN)); |
21400
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
424 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
425 %!test |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
426 %! subs = ceil (rand (2000, 2)*30); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
427 %! subsc = num2cell (subs, 1); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
428 %! vals = rand (2000, 1); |
21400
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
429 %! assert (accumarray (subsc, vals, [], [], 0, true), |
21580
ecce63c99c3f
maint: Add semicolons to terminate code in %! blocks.
Rik <rik@octave.org>
parents:
21402
diff
changeset
|
430 %! accumarray (subs, vals, [], [], 0, true)); |
21400
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
431 |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
432 %!test |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
433 %! subs = ceil (rand (2000, 3)*10); |
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
434 %! subsc = num2cell (subs, 1); |
11469
c776f063fefe
Overhaul m-script files to use common variable name between code and documentation.
Rik <octave@nomad.inbox5.com>
parents:
11191
diff
changeset
|
435 %! vals = rand (2000, 1); |
21400
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
436 %! assert (accumarray (subsc, vals, [], @max), |
00960129ebf4
accumarray.m: edit tests to follow coding guidelines.
Carnë Draug <carandraug@octave.org>
parents:
20852
diff
changeset
|
437 %! accumarray (subs, vals, [], @max)); |
10268
9a16a61ed43d
new optimizations for accumarray
Jaroslav Hajek <highegg@gmail.com>
parents:
9859
diff
changeset
|
438 |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
439 %!error (accumarray (1:5)) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14327
diff
changeset
|
440 %!error (accumarray ([1,2,3],1:2)) |
21401
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
441 |
22489
93ea313301f9
test: Add bug ids (<#####>) to BIST tests.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
442 ## Handle empty arrays |
23573
1b4f4ec53b4a
use new script to tag fixed bugs in tests
John W. Eaton <jwe@octave.org>
parents:
23572
diff
changeset
|
443 %!test <*47287> |
21401
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
444 %! ## min, max, and sum are special cases within accumarray so test them. |
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
445 %! funcs = {@(x) length (x) > 1, @min, @max, @sum}; |
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
446 %! for idx = 1:numel (funcs) |
21580
ecce63c99c3f
maint: Add semicolons to terminate code in %! blocks.
Rik <rik@octave.org>
parents:
21402
diff
changeset
|
447 %! assert (accumarray (zeros (0, 1), [], [0 1] , funcs{idx}), zeros (0, 1)); |
ecce63c99c3f
maint: Add semicolons to terminate code in %! blocks.
Rik <rik@octave.org>
parents:
21402
diff
changeset
|
448 %! assert (accumarray (zeros (0, 1), [], [1 0] , funcs{idx}), zeros (1, 0)); |
ecce63c99c3f
maint: Add semicolons to terminate code in %! blocks.
Rik <rik@octave.org>
parents:
21402
diff
changeset
|
449 %! assert (accumarray (zeros (0, 1), [], [] , funcs{idx}), zeros (0, 1)); |
21401
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
450 %! endfor |
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
451 |
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
452 ## Matlab returns an array of doubles even though FUNC returns cells. In |
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
453 ## Octave, we do not have that bug, at least for this case. |
2f402f7c1a0b
accumarray: fix general case for empty list of subscripts (bug #47287)
Carnë Draug <carandraug@octave.org>
parents:
21400
diff
changeset
|
454 %!assert (accumarray (zeros (0, 1), [], [0 1] , @(x) {x}), cell (0, 1)) |
23493
bf063fafeca5
accumarray.m: check if func is a function handle
Carnë Draug <carandraug@octave.org>
parents:
23220
diff
changeset
|
455 |
bf063fafeca5
accumarray.m: check if func is a function handle
Carnë Draug <carandraug@octave.org>
parents:
23220
diff
changeset
|
456 %!error <FUNC must be a function handle> |
bf063fafeca5
accumarray.m: check if func is a function handle
Carnë Draug <carandraug@octave.org>
parents:
23220
diff
changeset
|
457 %! accumarray ([1; 2; 3], [1; 2; 3], [3 1], '@(x) {x}') |