Mercurial > hg > octave-avbm
diff scripts/set/setdiff.m @ 5786:9c3c903f037e
[project @ 2006-05-03 20:03:41 by jwe]
author | jwe |
---|---|
date | Wed, 03 May 2006 20:05:26 +0000 |
parents | 2618a0750ae6 |
children | b3478d7a0486 |
line wrap: on
line diff
--- a/scripts/set/setdiff.m +++ b/scripts/set/setdiff.m @@ -19,34 +19,65 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {} setdiff (@var{a}, @var{b}) -## Return the elements in @var{a} but not in @var{b}, sorted in +## @deftypefnx {Function File} {} setdiff(@var{a}, @var{b}, "rows") +## Return the elements in @var{a} that are not in @var{b}, sorted in ## ascending order. If @var{a} and @var{b} are both column vectors ## return a column vector, otherwise return a row vector. +## +## Given the optional third argument @samp{"rows"}, return the rows in +## @var{a} that are not in @var{b}, sorted in ascending order by rows. ## @seealso{unique, union, intersect, setxor, ismember} ## @end deftypefn ## Author: Paul Kienzle ## Adapted-by: jwe -function c = setdiff (a, b) +function c = setdiff (a, b, byrows) + + if (nargin < 2 || nargin > 3) + usage ("setdiff (a, b) or setdiff (a, b, \"rows\")"); + endif - if (nargin != 2) - usage ("setdiff (a, b)"); + if (nargin == 3) + if (! strcmpi (byrows, "rows")) + error ("expecting third argument to be \"rows\""); + else + byrows = true; + endif + else + byrows = false; endif - c = unique (a); - if (! isempty (c) && ! isempty (b)) - ## Form a and b into combined set. - b = unique (b); - [dummy, idx] = sort ([c(:); b(:)]); - ## Eliminate those elements of a that are the same as in b. - n = length (dummy); - c(idx(find (dummy(1:n-1) == dummy(2:n)))) = []; - ## Reshape if necessary. - if (size (c, 1) != 1 && size (b, 1) == 1) - c = c.'; + if (byrows) + c = unique (a, "rows"); + if (! isempty (c) && ! isempty (b)) + ## Form a and b into combined set. + b = unique (b, "rows"); + [dummy, idx] = sortrows ([c; b]); + ## Eliminate those elements of a that are the same as in b. + n = length (dummy); + c(idx(find (dummy(1:n-1) == dummy(2:n))), :) = []; + endif + else + c = unique (a); + if (! isempty (c) && ! isempty (b)) + ## Form a and b into combined set. + b = unique (b); + [dummy, idx] = sort ([c(:); b(:)]); + ## Eliminate those elements of a that are the same as in b. + n = length (dummy); + c(idx(find (dummy(1:n-1) == dummy(2:n)))) = []; + ## Reshape if necessary. + if (size (c, 1) != 1 && size (b, 1) == 1) + c = c.'; + endif endif endif - + endfunction +%!assert(setdiff(["bb";"zz";"bb";"zz"],["bb";"cc";"bb"],"rows"), "zz") +%!assert(setdiff(["b";"z";"b";"z"],["b";"c";"b"],"rows"), "z") +%!assert(setdiff(["b";"z";"b";"z"],["b";"c";"b"]), "z") +%!assert(setdiff([1, 1; 2, 2; 3, 3; 4, 4], [1, 1; 2, 2; 4, 4], "rows"), [3 3]) +%!assert(setdiff([1; 2; 3; 4], [1; 2; 4], "rows"), 3)