changeset 27232:3d10834979f8

union.m: Accept a "legacy" flag for Matlab compatibility. * NEWS: Announce change. * union.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. Add BIST tests for "legacy" input.
author Rik <rik@octave.org>
date Wed, 10 Jul 2019 20:06:04 -0700
parents 9f44123dc25b
children fc668ac9ce7c
files NEWS scripts/set/union.m
diffstat 2 files changed, 27 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Wed Jul 10 19:51:37 2019 -0700
+++ b/NEWS	Wed Jul 10 20:06:04 2019 -0700
@@ -53,9 +53,9 @@
   behavior, or Matlab behavior from releases prior to R2012b, can be
   obtained by using the `"legacy"` flag.
 
-- The function `intersect` now accepts a `"legacy"` flag which changes
-  the index values (second and third outputs) as well as the orientation
-  of the outputs to match Matlab releases prior to R2012b.
+- The functions `intersect`, `union` now accept a `"legacy"` flag which
+  changes the index values (second and third outputs) as well as the
+  orientation of the 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
--- a/scripts/set/union.m	Wed Jul 10 19:51:37 2019 -0700
+++ b/scripts/set/union.m	Wed Jul 10 20:06:04 2019 -0700
@@ -33,8 +33,8 @@
 ## either @var{a} or @var{b}.  The inputs must be 2-D matrices to use this
 ## option.
 ##
-## The optional outputs @var{ia} and @var{ib} are index vectors 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}.
 ##
 ## @seealso{unique, intersect, setdiff, setxor, ismember}
@@ -44,14 +44,20 @@
 
 function [y, ia, ib] = union (a, b, varargin)
 
-  if (nargin < 2 || nargin > 3)
+  if (nargin < 2 || nargin > 4)
     print_usage ();
   endif
 
   [a, b] = validsetargs ("union", 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
 
   if (by_rows)
     y = [a; b];
@@ -104,6 +110,19 @@
 %!assert (nthargout (2:3, @union, [1 2; 2 3; 4 5], [2 3; 3 4; 5 6], "rows"),
 %!        {[1; 3], [1; 2; 3]})
 
+## Test "legacy" option
+%!test
+%! a = [5, 7, 1];
+%! b = [3, 1, 1];
+%! [c, ia, ib] = union (a,b);
+%! assert (c, [1, 3, 5, 7]);
+%! assert (ia, [3; 1; 2]);
+%! assert (ib, [1]);
+%! [c, ia, ib] = union (a,b, "legacy");
+%! assert (c, [1, 3, 5, 7]);
+%! assert (ia, [1, 2]);
+%! assert (ib, [3, 1]);
+
 ## Test empty cell string array unions
 %!assert (union ({}, []), cell (0,1))
 %!assert (union ([], {}), cell (0,1))