# HG changeset patch # User Rik # Date 1562900153 25200 # Node ID 177be3c0123895872ba763d25bc7bc61911515c8 # Parent 67e5e997a3bfcb00035a538623dad5332d4037b6 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. diff -r 67e5e997a3bf -r 177be3c01238 NEWS --- a/NEWS Thu Jul 11 15:29:38 2019 -0700 +++ b/NEWS Thu Jul 11 19:55:53 2019 -0700 @@ -58,9 +58,10 @@ from releases prior to R2012b, can be obtained by using the `"legacy"` flag. -- The functions `intersect`, `union` now accept a `"legacy"` flag which - changes the index values (second and third outputs) as well as the - orientation of all outputs to match Matlab releases prior to R2012b. +- The functions `intersect`, `setxor`, `union`, now accept a `"legacy"` + flag which changes the index values (second and third outputs) as well + as the orientation of all outputs to match Matlab releases prior to + R2012b. - Complex RESTful web services can now be accessed by the `webread` and `webwrite` functions alongside with the `weboptions` structure. One diff -r 67e5e997a3bf -r 177be3c01238 scripts/set/setxor.m --- 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]);