Mercurial > octave
annotate scripts/set/setxor.m @ 27294:aa4147476138
setxor.m: Add new option "stable" to control output ordering.
* NEWS: Announce new option.
* setxor.m: Rewrite docstring to include "stable" and "sorted" options and
documentation. Implement "stable" algorithm. Add BIST tests for behavior.
author | Rik <rik@octave.org> |
---|---|
date | Sat, 27 Jul 2019 18:28:45 -0700 |
parents | 177be3c01238 |
children | 538468f901dd |
rev | line source |
---|---|
26376
00f796120a6d
maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents:
25054
diff
changeset
|
1 ## Copyright (C) 2014-2019 Julien Bect |
00f796120a6d
maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents:
25054
diff
changeset
|
2 ## Copyright (C) 2008-2019 Jaroslav Hajek |
11523 | 3 ## Copyright (C) 2000, 2006-2007 Paul Kienzle |
5825 | 4 ## |
5 ## This file is part of Octave. | |
6 ## | |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
7 ## Octave is free software: you can redistribute it and/or modify it |
22802
0dcff7695e26
maint: Update more Copyright statements to use standard form.
Rik <rik@octave.org>
parents:
22755
diff
changeset
|
8 ## 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:
23220
diff
changeset
|
9 ## the Free Software Foundation, either version 3 of the License, or |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
10 ## (at your option) any later version. |
5825 | 11 ## |
22802
0dcff7695e26
maint: Update more Copyright statements to use standard form.
Rik <rik@octave.org>
parents:
22755
diff
changeset
|
12 ## Octave is distributed in the hope that it will be useful, but |
0dcff7695e26
maint: Update more Copyright statements to use standard form.
Rik <rik@octave.org>
parents:
22755
diff
changeset
|
13 ## WITHOUT ANY WARRANTY; without even the implied warranty of |
0dcff7695e26
maint: Update more Copyright statements to use standard form.
Rik <rik@octave.org>
parents:
22755
diff
changeset
|
14 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
0dcff7695e26
maint: Update more Copyright statements to use standard form.
Rik <rik@octave.org>
parents:
22755
diff
changeset
|
15 ## GNU General Public License for more details. |
5825 | 16 ## |
17 ## You should have received a copy of the GNU General Public License | |
7016 | 18 ## 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:
23220
diff
changeset
|
19 ## <https://www.gnu.org/licenses/>. |
5825 | 20 |
21 ## -*- texinfo -*- | |
20852
516bb87ea72e
2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents:
20437
diff
changeset
|
22 ## @deftypefn {} {@var{c} =} setxor (@var{a}, @var{b}) |
516bb87ea72e
2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents:
20437
diff
changeset
|
23 ## @deftypefnx {} {@var{c} =} setxor (@var{a}, @var{b}, "rows") |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
24 ## @deftypefnx {} {@var{c} =} setxor (@dots{}, "sorted") |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
25 ## @deftypefnx {} {@var{c} =} setxor (@dots{}, "stable") |
27238
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
26 ## @deftypefnx {} {@var{c} =} setxor (@dots{}, "legacy") |
20852
516bb87ea72e
2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents:
20437
diff
changeset
|
27 ## @deftypefnx {} {[@var{c}, @var{ia}, @var{ib}] =} setxor (@dots{}) |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
28 ## |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
29 ## Return the unique elements exclusive to sets @var{a} or @var{b}. |
5825 | 30 ## |
19974
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
31 ## If @var{a} and @var{b} are both row vectors then return a row vector; |
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
32 ## Otherwise, return a column vector. The inputs may also be cell arrays of |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
33 ## strings. |
5825 | 34 ## |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
35 ## If the optional input @qcode{"rows"} is given then return the rows exclusive |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
36 ## to sets @var{a} and @var{b}. The inputs must be 2-D numeric matrices to use |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
37 ## this option. |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
38 ## |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
39 ## The optional argument @qcode{"sorted"}/@qcode{"stable"} controls the order |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
40 ## in which unique values appear in the output. The default is |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
41 ## @qcode{"sorted"} and values in the output are placed in ascending order. |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
42 ## The alternative @qcode{"stable"} preserves the order found in the input. |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
43 ## |
27238
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
44 ## The optional outputs @var{ia} and @var{ib} are column index vectors such |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
45 ## that @code{@var{a}(@var{ia})} and @code{@var{b}(@var{ib})} are disjoint sets |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
46 ## whose union is @var{c}. |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
47 ## |
27238
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
48 ## Programming Note: The input flag @qcode{"legacy"} changes the algorithm |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
49 ## to be compatible with @sc{matlab} releases prior to R2012b. |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
50 ## |
5825 | 51 ## @seealso{unique, union, intersect, setdiff, ismember} |
52 ## @end deftypefn | |
53 | |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
54 function [c, ia, ib] = setxor (a, b, varargin) |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
55 |
27238
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
56 if (nargin < 2 || nargin > 4) |
6046 | 57 print_usage (); |
5825 | 58 endif |
59 | |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
60 [a, b] = validsetargs ("setxor", a, b, varargin{:}); |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
61 |
27238
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
62 by_rows = any (strcmp ("rows", varargin)); |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
63 optsorted = ! any (strcmp ("stable", varargin)); |
27238
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
64 optlegacy = any (strcmp ("legacy", varargin)); |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
65 |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
66 if (optlegacy) |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
67 isrowvec = ! iscolumn (a) || ! iscolumn (b); |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
68 else |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
69 isrowvec = isrow (a) && isrow (b); |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
70 endif |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
71 |
5825 | 72 ## Form A and B into sets. |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
73 if (nargout > 1 || ! optsorted) |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
74 [a, ia] = unique (a, varargin{:}); |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
75 [b, ib] = unique (b, varargin{:}); |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
76 else |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
77 a = unique (a, varargin{:}); |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
78 b = unique (b, varargin{:}); |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
79 endif |
5825 | 80 |
81 if (isempty (a)) | |
82 c = b; | |
83 elseif (isempty (b)) | |
84 c = a; | |
85 else | |
86 ## Reject duplicates. | |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
87 if (by_rows) |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
88 na = rows (a); nb = rows (b); |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
89 [c, i] = sortrows ([a; b]); |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
90 n = rows (c); |
18081
42df174ec2ff
setxor.m: Fix bug when "rows" argument given (bug #40808).
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
91 idx = find (all (c(1:n-1, :) == c(2:n, :), 2)); |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
92 if (optsorted) |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
93 if (! isempty (idx)) |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
94 c([idx, idx+1],:) = []; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
95 i([idx, idx+1],:) = []; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
96 endif |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
97 else |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
98 c = [a; b]; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
99 c(i([idx, idx+1]), :) = []; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
100 if (nargout > 1) |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
101 i([idx, idx+1]) = []; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
102 ## FIXME: Is there a way to avoid a call to sort? |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
103 i = sort (i); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
104 endif |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
105 endif |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
106 else |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
107 na = numel (a); nb = numel (b); |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
108 [c, i] = sort ([a(:); b(:)]); |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
109 n = numel (c); |
9481
a3ae7abaf659
support cellstrs in setxor
Pieter Eendebak <pieter.eendebak@gmail.com>
parents:
9051
diff
changeset
|
110 if (iscell (c)) |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
111 idx = find (strcmp (c(1:n-1), c(2:n))); |
9481
a3ae7abaf659
support cellstrs in setxor
Pieter Eendebak <pieter.eendebak@gmail.com>
parents:
9051
diff
changeset
|
112 else |
a3ae7abaf659
support cellstrs in setxor
Pieter Eendebak <pieter.eendebak@gmail.com>
parents:
9051
diff
changeset
|
113 idx = find (c(1:n-1) == c(2:n)); |
a3ae7abaf659
support cellstrs in setxor
Pieter Eendebak <pieter.eendebak@gmail.com>
parents:
9051
diff
changeset
|
114 endif |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
115 if (optsorted) |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
116 if (! isempty (idx)) |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
117 c([idx, idx+1]) = []; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
118 i([idx, idx+1]) = []; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
119 endif |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
120 else |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
121 c = [a(:); b(:)]; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
122 c(i([idx, idx+1])) = []; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
123 if (nargout > 1) |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
124 i([idx, idx+1]) = []; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
125 ## FIXME: Is there a way to avoid a call to sort? |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
126 i = sort (i); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
127 endif |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
128 endif |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
129 |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
130 ## Adjust output orientation for Matlab compatibility |
19974
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
131 if (isrowvec) |
10549 | 132 c = c.'; |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
133 endif |
5825 | 134 endif |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
135 |
19157
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
136 if (nargout > 1) |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
137 ia = ia(i(i <= na)); |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
138 ib = ib(i(i > na) - na); |
27238
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
139 if (optlegacy && isrowvec) |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
140 ia = ia(:).'; |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
141 ib = ib(:).'; |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
142 endif |
19157
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
143 endif |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
144 endif |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
145 |
5825 | 146 endfunction |
147 | |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14359
diff
changeset
|
148 |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
149 %!assert (setxor ([3,1,2], [4,3,2]), [1,4]) |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14359
diff
changeset
|
150 %!assert (setxor ({'a'}, {'a', 'b'}), {'b'}) |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
151 %!assert (setxor ([5, NaN, NaN], [NaN, NaN, 5]), [NaN NaN NaN NaN]) |
18081
42df174ec2ff
setxor.m: Fix bug when "rows" argument given (bug #40808).
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
152 |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
153 %!test |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
154 %! a = [3, 1, 4, 1, 5]; |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
155 %! b = [1; 2; 3; 4]; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
156 %! [c, ia, ib] = setxor (a, b); |
19974
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
157 %! assert (c, [2; 5]); |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
158 %! assert (ia, [5]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
159 %! assert (ib, [2]); |
9498
f7cc8f30f3b8
Added test for setxor
Pieter Eendebak <pieter.eendebak@gmail.com>
parents:
9481
diff
changeset
|
160 |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
161 ## Test "rows" input |
18081
42df174ec2ff
setxor.m: Fix bug when "rows" argument given (bug #40808).
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
162 %!test |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
163 %! a = [1 2; 4 5; 1 3]; |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
164 %! b = [1 1; 1 2; 4 5; 2 10]; |
18081
42df174ec2ff
setxor.m: Fix bug when "rows" argument given (bug #40808).
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
165 %! [c, ia, ib] = setxor (a, b, "rows"); |
42df174ec2ff
setxor.m: Fix bug when "rows" argument given (bug #40808).
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
166 %! assert (c, [1 1; 1 3; 2 10]); |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
167 %! assert (ia, [3]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
168 %! assert (ib, [1; 4]); |
18081
42df174ec2ff
setxor.m: Fix bug when "rows" argument given (bug #40808).
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
169 |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
170 ## Test "stable" sort order |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
171 %!test |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
172 %! a = [3, 1, 4, 1, 5]; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
173 %! b = [1; 2; 3; 4]; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
174 %! [c, ia, ib] = setxor (a, b, "stable"); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
175 %! assert (c, [5; 2]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
176 %! assert (ia, [5]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
177 %! assert (ib, [2]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
178 |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
179 %!test |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
180 %! a = [1 2; 4 5; 1 3]; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
181 %! b = [1 1; 1 2; 4 5; 2 10]; |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
182 %! [c, ia, ib] = setxor (a, b, "rows", "stable"); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
183 %! assert (c, [1 3; 1 1; 2 10]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
184 %! assert (ia, [3]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
185 %! assert (ib, [1; 4]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
186 |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
187 ## Test various empty matrix inputs |
19157
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
188 %!assert (setxor (1, []), 1) |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
189 %!assert (setxor ([], 1), 1) |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
190 |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
191 %!test |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
192 %! [c, ia, ib] = setxor ([3 1], []); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
193 %! assert (c, [1 3]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
194 %! assert (ia, [2; 1]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
195 %! assert (ib, []); |
19157
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
196 %!test |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
197 %! [c, ia, ib] = setxor ([], [3 1]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
198 %! assert (c, [1 3]); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
199 %! assert (ia, []); |
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
200 %! assert (ib, [2; 1]); |
19157
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
201 |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
202 %!test |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
203 %! a = [2 1; 4 3]; b = []; |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
204 %! [c, ia, ib] = setxor (a, b); |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
205 %! assert (c, [1; 2; 3; 4]); |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
206 %! assert (ia, [3; 1; 4; 2]); |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
207 %! assert (isempty (ib)); |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
208 |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
209 %!test |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
210 %! a = []; b = [2 1; 4 3]; |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
211 %! [c, ia, ib] = setxor (a, b); |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
212 %! assert (c, [1; 2; 3; 4]); |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
213 %! assert (isempty (ia)); |
d171e23cac81
setxor.m: Fix bug with empty set input and multiple outputs (bug #43140).
Julien Bect <julien.bect@supelec.fr>
parents:
19003
diff
changeset
|
214 %! assert (ib, [3; 1; 4; 2]); |
27294
aa4147476138
setxor.m: Add new option "stable" to control output ordering.
Rik <rik@octave.org>
parents:
27238
diff
changeset
|
215 |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
216 ## Test orientation of output |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
217 %!shared x,y |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
218 %! x = 1:3; |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
219 %! y = 2:5; |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
220 |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
221 %!assert (size (setxor (x, y)), [1 3]) |
19974
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
222 %!assert (size (setxor (x', y)), [3 1]) |
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
223 %!assert (size (setxor (x, y')), [3 1]) |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
224 %!assert (size (setxor (x', y')), [3 1]) |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
225 |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
226 ## Test multi-dimensional arrays |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
227 %!test |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
228 %! a = rand (3,3,3); |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
229 %! b = a; |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18081
diff
changeset
|
230 %! b(1,1,1) = 2; |
19974
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19697
diff
changeset
|
231 %! assert (intersect (a, b), sort (a(2:end)')); |
27238
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
232 |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
233 ## Test "legacy" input |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
234 %!test |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
235 %! a = [5 1 3 3 3]; |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
236 %! b = [4 1 2 2]; |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
237 %! [c,ia,ib] = setxor (a,b); |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
238 %! assert (c, [2, 3, 4, 5]); |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
239 %! assert (ia, [3; 1]); |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
240 %! assert (ib, [3; 1]); |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
241 %! [c,ia,ib] = setxor (a,b, "legacy"); |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
242 %! assert (c, [2, 3, 4, 5]); |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
243 %! assert (ia, [5, 1]); |
177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
Rik <rik@octave.org>
parents:
26376
diff
changeset
|
244 %! assert (ib, [4, 1]); |