Mercurial > octave
diff scripts/set/setxor.m @ 27238:177be3c01238
setxor.m: Accept a "legacy" flag for Matlab compatibility.
* NEWS: Announce "legacy" flag.
* setxor.m Add new calling form and explanation of "legacy" option to
docstring. Allow up to 4 inputs in input validation. Check for "legacy"
in input options and set variable optlegacy. Set variable isrowvec based
on optlegacy and orientation of inputs. Adjust orientation of outputs ia, ib
based on optlegacy and isrowvec. Add BIST test for "legacy" input.
author | Rik <rik@octave.org> |
---|---|
date | Thu, 11 Jul 2019 19:55:53 -0700 |
parents | 00f796120a6d |
children | aa4147476138 |
line wrap: on
line diff
--- a/scripts/set/setxor.m Thu Jul 11 15:29:38 2019 -0700 +++ b/scripts/set/setxor.m Thu Jul 11 19:55:53 2019 -0700 @@ -21,6 +21,7 @@ ## -*- texinfo -*- ## @deftypefn {} {@var{c} =} setxor (@var{a}, @var{b}) ## @deftypefnx {} {@var{c} =} setxor (@var{a}, @var{b}, "rows") +## @deftypefnx {} {@var{c} =} setxor (@dots{}, "legacy") ## @deftypefnx {} {[@var{c}, @var{ia}, @var{ib}] =} setxor (@dots{}) ## ## Return the unique elements exclusive to sets @var{a} or @var{b} sorted in @@ -34,23 +35,32 @@ ## to sets @var{a} and @var{b}. The inputs must be 2-D matrices to use this ## option. ## -## If requested, return index vectors @var{ia} and @var{ib} such that -## @code{@var{a}(@var{ia})} and @code{@var{b}(@var{ib})} are disjoint sets +## The optional outputs @var{ia} and @var{ib} are column index vectors such +## that @code{@var{a}(@var{ia})} and @code{@var{b}(@var{ib})} are disjoint sets ## whose union is @var{c}. ## +## Programming Note: The input flag @qcode{"legacy"} changes the algorithm +## to be compatible with @sc{matlab} releases prior to R2012b. +## ## @seealso{unique, union, intersect, setdiff, ismember} ## @end deftypefn function [c, ia, ib] = setxor (a, b, varargin) - if (nargin < 2 || nargin > 3) + if (nargin < 2 || nargin > 4) print_usage (); endif [a, b] = validsetargs ("setxor", a, b, varargin{:}); - by_rows = nargin == 3; - isrowvec = isrow (a) && isrow (b); + by_rows = any (strcmp ("rows", varargin)); + optlegacy = any (strcmp ("legacy", varargin)); + + if (optlegacy) + isrowvec = ! iscolumn (a) || ! iscolumn (b); + else + isrowvec = isrow (a) && isrow (b); + endif ## Form A and B into sets. if (nargout > 1) @@ -99,6 +109,10 @@ if (nargout > 1) ia = ia(i(i <= na)); ib = ib(i(i > na) - na); + if (optlegacy && isrowvec) + ia = ia(:).'; + ib = ib(:).'; + endif endif endif @@ -166,3 +180,16 @@ %! b = a; %! b(1,1,1) = 2; %! assert (intersect (a, b), sort (a(2:end)')); + +## Test "legacy" input +%!test +%! a = [5 1 3 3 3]; +%! b = [4 1 2 2]; +%! [c,ia,ib] = setxor (a,b); +%! assert (c, [2, 3, 4, 5]); +%! assert (ia, [3; 1]); +%! assert (ib, [3; 1]); +%! [c,ia,ib] = setxor (a,b, "legacy"); +%! assert (c, [2, 3, 4, 5]); +%! assert (ia, [5, 1]); +%! assert (ib, [4, 1]);