Mercurial > octave
annotate scripts/set/setdiff.m @ 23219:3ac9f9ecfae5 stable
maint: Update copyright dates.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 22 Feb 2017 12:39:29 -0500 |
parents | e9a0469dedd9 |
children | 092078913d54 |
rev | line source |
---|---|
23219
3ac9f9ecfae5
maint: Update copyright dates.
John W. Eaton <jwe@octave.org>
parents:
23083
diff
changeset
|
1 ## Copyright (C) 2000-2017 Paul Kienzle |
11523 | 2 ## Copyright (C) 2008-2009 Jaroslav Hajek |
5178 | 3 ## |
5181 | 4 ## This file is part of Octave. |
5178 | 5 ## |
5181 | 6 ## Octave is free software; you can redistribute it and/or modify it |
7 ## under the terms of the GNU General Public License as published by | |
7016 | 8 ## the Free Software Foundation; either version 3 of the License, or (at |
9 ## your option) any later version. | |
5181 | 10 ## |
11 ## Octave is distributed in the hope that it will be useful, but | |
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 ## General Public License for more details. | |
5178 | 15 ## |
16 ## You should have received a copy of the GNU General Public License | |
7016 | 17 ## along with Octave; see the file COPYING. If not, see |
18 ## <http://www.gnu.org/licenses/>. | |
5178 | 19 |
20 ## -*- texinfo -*- | |
20852
516bb87ea72e
2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents:
20437
diff
changeset
|
21 ## @deftypefn {} {@var{c} =} setdiff (@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
|
22 ## @deftypefnx {} {@var{c} =} setdiff (@var{a}, @var{b}, "rows") |
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}, @var{ia}] =} setdiff (@dots{}) |
19974
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19833
diff
changeset
|
24 ## Return the unique elements in @var{a} that are not in @var{b} sorted in |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
25 ## ascending order. |
5786 | 26 ## |
20160
03b9d17a2d95
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19974
diff
changeset
|
27 ## If @var{a} is a row vector return a column vector; Otherwise, return a |
03b9d17a2d95
doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents:
19974
diff
changeset
|
28 ## column vector. The inputs may also be cell arrays of strings. |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
29 ## |
19597
db92e7e28e1f
strip trailing whitespace from most source files
John W. Eaton <jwe@octave.org>
parents:
19003
diff
changeset
|
30 ## If the optional input @qcode{"rows"} is given then return the rows in |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
31 ## @var{a} that are not in @var{b}. The inputs must be 2-D matrices to use |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
32 ## this option. |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
33 ## |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
34 ## If requested, return the index vector @var{ia} such that |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
35 ## @code{@var{c} = @var{a}(@var{ia})}. |
5642 | 36 ## @seealso{unique, union, intersect, setxor, ismember} |
5178 | 37 ## @end deftypefn |
38 | |
5181 | 39 ## Author: Paul Kienzle |
40 ## Adapted-by: jwe | |
41 | |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
42 function [c, ia] = setdiff (a, b, varargin) |
5786 | 43 |
44 if (nargin < 2 || nargin > 3) | |
6046 | 45 print_usage (); |
5786 | 46 endif |
5181 | 47 |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
48 [a, b] = validsetargs ("setdiff", a, b, varargin{:}); |
6385 | 49 |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
50 by_rows = nargin == 3; |
20437
c3b2ec6a1586
Remove redundant isvector() calls in set/ functions.
Rik <rik@octave.org>
parents:
20160
diff
changeset
|
51 isrowvec = isrow (a); |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
52 |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
53 if (by_rows) |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
54 if (nargout > 1) |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
55 [c, ia] = unique (a, "rows"); |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
56 else |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
57 c = unique (a, "rows"); |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
58 endif |
5786 | 59 if (! isempty (c) && ! isempty (b)) |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
60 ## Form A and B into combined set. |
5786 | 61 b = unique (b, "rows"); |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
62 [tmp, idx] = sortrows ([c; b]); |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
63 ## Eliminate those elements of A that are the same as in B. |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
64 dups = find (all (tmp(1:end-1,:) == tmp(2:end,:), 2)); |
6386 | 65 c(idx(dups),:) = []; |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
66 if (nargout > 1) |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
67 ia(idx(dups),:) = []; |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
68 endif |
5786 | 69 endif |
70 else | |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
71 if (nargout > 1) |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
72 [c, ia] = unique (a); |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
73 else |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
74 c = unique (a); |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
75 endif |
5786 | 76 if (! isempty (c) && ! isempty (b)) |
77 ## Form a and b into combined set. | |
78 b = unique (b); | |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
79 [tmp, idx] = sort ([c(:); b(:)]); |
5786 | 80 ## Eliminate those elements of a that are the same as in b. |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
81 if (iscellstr (tmp)) |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
82 dups = find (strcmp (tmp(1:end-1), tmp(2:end))); |
6385 | 83 else |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
84 dups = find (tmp(1:end-1) == tmp(2:end)); |
6385 | 85 endif |
6386 | 86 c(idx(dups)) = []; |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
87 if (nargout > 1) |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
88 ia(idx(dups)) = []; |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
89 endif |
18843
30d8501a857a
setdiff.m: Orient output (row/column) the same as Matlab (bug #42577).
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
90 ## Reshape if necessary for Matlab compatibility. |
19974
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19833
diff
changeset
|
91 if (isrowvec) |
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19833
diff
changeset
|
92 c = c(:).'; |
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19833
diff
changeset
|
93 else |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
94 c = c(:); |
5786 | 95 endif |
5178 | 96 endif |
97 endif | |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
98 |
5178 | 99 endfunction |
11587
c792872f8942
all script files: untabify and strip trailing whitespace
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
100 |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
101 |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
102 %!assert (setdiff (["bb";"zz";"bb";"zz"], ["bb";"cc";"bb"], "rows"), "zz") |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
103 %!assert (setdiff (["b";"z";"b";"z"], ["b";"c";"b"], "rows"), "z") |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
104 %!assert (setdiff (["b";"z";"b";"z"], ["b";"c";"b"]), "z") |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
105 %!assert (setdiff ([1, 1; 2, 2; 3, 3; 4, 4], [1, 1; 2, 2; 4, 4], "rows"), [3 3]) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
106 %!assert (setdiff ([1; 2; 3; 4], [1; 2; 4], "rows"), 3) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
107 %!assert (setdiff ([1, 2; 3, 4], [1, 2; 3, 6], "rows"), [3, 4]) |
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
108 %!assert (setdiff ({"one","two";"three","four"}, {"one","two";"three","six"}), {"four"}) |
7920
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
109 |
e56bb65186f6
improve set functions for Matlab compatibility
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
110 %!test |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
111 %! a = [3, 1, 4, 1, 5]; |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
112 %! b = [1, 2, 3, 4]; |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
113 %! [c, ia] = setdiff (a, b'); |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
114 %! assert (c, [5]); |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
115 %! assert (c, a(ia)); |
14363
f3d52523cde1
Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents:
14138
diff
changeset
|
116 |
22489
93ea313301f9
test: Add bug ids (<#####>) to BIST tests.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
117 ## Test output orientation compatibility |
93ea313301f9
test: Add bug ids (<#####>) to BIST tests.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
118 %!assert <42577> (setdiff ([1:5], 2), [1,3,4,5]) |
93ea313301f9
test: Add bug ids (<#####>) to BIST tests.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
119 %!assert <42577> (setdiff ([1:5]', 2), [1;3;4;5]) |
93ea313301f9
test: Add bug ids (<#####>) to BIST tests.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
120 %!assert <42577> (setdiff ([1:5], [2:3]), [1,4,5]) |
93ea313301f9
test: Add bug ids (<#####>) to BIST tests.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
121 %!assert <42577> (setdiff ([1:5], [2:3]'), [1,4,5]) |
93ea313301f9
test: Add bug ids (<#####>) to BIST tests.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
122 %!assert <42577> (setdiff ([1:5]', [2:3]), [1;4;5]) |
93ea313301f9
test: Add bug ids (<#####>) to BIST tests.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
123 %!assert <42577> (setdiff ([1:5]', [2:3]'), [1;4;5]) |
18843
30d8501a857a
setdiff.m: Orient output (row/column) the same as Matlab (bug #42577).
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
124 |
19003
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
125 %!test |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
126 %! a = rand (3,3,3); |
d00f6b09258f
Overhaul functions in scripts/set directory.
Rik <rik@octave.org>
parents:
18843
diff
changeset
|
127 %! b = a(1); |
19974
72ccbd36e23c
Return a column vector by default for Matlab compatibility (bug #44425, bug #44453).
Rik <rik@octave.org>
parents:
19833
diff
changeset
|
128 %! assert (setdiff (a, b), sort (a(2:end)')); |