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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
fd0a3ac60b0e update copyright notices
John W. Eaton <jwe@octave.org>
parents: 11472
diff changeset
2 ## Copyright (C) 2009-2010 VZLU Prague
6770
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
3 ##
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6770
diff changeset
4 ## This file is part of Octave.
6770
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6770
diff changeset
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
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6770
diff changeset
10 ##
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6770
diff changeset
11 ## Octave is distributed in the hope that it will be useful, but
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6770
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
15 ##
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
16 ## You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6770
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
19
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
23 ##
7186
800f1fd3ffb8 [project @ 2007-11-26 19:16:07 by jwe]
jwe
parents: 7016
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
66 ##
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
67 ## @example
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
92 ## @end group
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
127 ## @end deftypefn
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
130
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
131 if (nargin < 2 || nargin > 6)
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
132 print_usage ();
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
133 endif
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
800f1fd3ffb8 [project @ 2007-11-26 19:16:07 by jwe]
jwe
parents: 7016
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
155 endif
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
164 fillval = 0;
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
165 endif
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
169 endif
7186
800f1fd3ffb8 [project @ 2007-11-26 19:16:07 by jwe]
jwe
parents: 7016
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
6892c5562950 fix bug in accumarray
Jaroslav Hajek <highegg@gmail.com>
parents: 10283
diff changeset
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
6892c5562950 fix bug in accumarray
Jaroslav Hajek <highegg@gmail.com>
parents: 10283
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
377 endif
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
378 endif
21758
ffad2baa90f7 maint: Use newlines to make code more readable.
Rik <rik@octave.org>
parents: 21751
diff changeset
379
6770
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
380 endfunction
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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
babcbcc11ab6 [project @ 2007-07-06 08:44:04 by dbateman]
dbateman
parents:
diff changeset
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}')