changeset 11921:166a195399f7 release-3-0-x

[project @ 2008-01-04 18:18:22 by jwe]
author jwe
date Fri, 16 Jan 2009 08:07:05 +0100
parents 7118a78a4378
children 746f13936eee
files scripts/ChangeLog scripts/set/create_set.m scripts/set/union.m
diffstat 3 files changed, 56 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/ChangeLog
+++ b/scripts/ChangeLog
@@ -1,3 +1,7 @@
+2008-01-04  Soren Hauberg   <hauberg@gmail.com>
+
+	* set/create_set.m, set/union.m: Accept "rows" argument.
+
 2008-01-15  Ben Abbott  <bpabbott@mac.com>
 
 	* plot/grid.m: Document handle argument.
--- a/scripts/set/create_set.m
+++ b/scripts/set/create_set.m
@@ -1,4 +1,4 @@
-## Copyright (C) 1994, 1996, 1997, 1999, 2000, 2004, 2005, 2006, 2007
+## Copyright (C) 1994, 1996, 1997, 1999, 2000, 2004, 2005, 2006, 2007, 2008
 ##               John W. Eaton
 ##
 ## This file is part of Octave.
@@ -19,37 +19,44 @@
 
 ## -*- texinfo -*-
 ## @deftypefn {Function File} {} create_set (@var{x})
+## @deftypefnx{Function File} {} create_set (@var{x}, "rows")
 ## Return a row vector containing the unique values in @var{x}, sorted in
 ## ascending order.  For example,
 ##
 ## @example
 ## @group
-## create_set ([ 1, 2; 3, 4; 4, 2 ])
+## create_set ([ 1, 2; 3, 4; 4, 2; 1, 2 ])
 ##      @result{} [ 1, 2, 3, 4 ]
 ## @end group
 ## @end example
-## @seealso{union, intersection, complement}
+##
+## If the optional second input argument is the string "rows" each row of
+## the matrix @var{x} will be considered an element of set.  For example,
+## @example
+## @group
+## create_set ([ 1, 2; 3, 4; 4, 2; 1, 2 ], "rows")
+##      @result{}  1   2
+##     3   4
+##     4   2
+## @end group
+## @end example
+## @seealso{union, intersection, complement, unique}
 ## @end deftypefn
 
 ## Author: jwe
 
-function y = create_set(x)
+function y = create_set (x, rows_opt)
 
-  if (nargin != 1)
+  if (nargin < 1 || nargin > 2)
     print_usage ();
   endif
-
-  if (isempty(x))
-    y = [];
+  
+  if (nargin == 1)
+    y = unique (x).';
+  elseif (strcmpi (rows_opt, "rows"))
+    y = unique (x, "rows");
   else
-    nel = numel (x);
-    y = sort (reshape (x, 1, nel));
-    els = find (y(1:nel-1) != y(2:nel));
-    if (isempty (els));
-      y = y(1);
-    else
-      y = y([1, els+1]);
-    endif
+    error ("create_set: expecting \"rows\" as second argument");
   endif
 
 endfunction
--- a/scripts/set/union.m
+++ b/scripts/set/union.m
@@ -1,5 +1,5 @@
 ## Copyright (C) 1994, 1996, 1997, 1999, 2000, 2003, 2004, 2005, 2006,
-##               2007 John W. Eaton
+##               2007, 2008 John W. Eaton
 ##
 ## This file is part of Octave.
 ##
@@ -19,13 +19,26 @@
 
 ## -*- texinfo -*-
 ## @deftypefn {Function File} {} union (@var{x}, @var{y})
+## @deftypefnx{Function File} {} union (@var{x}, @var{y}, "rows")
 ## Return the set of elements that are in either of the sets @var{x} and
 ## @var{y}.  For example,
 ##
 ## @example
 ## @group
-## union ([ 1, 2, 4 ], [ 2, 3, 5 ])
-##      @result{} [ 1, 2, 3, 4, 5 ]
+## union ([1, 2, 4], [2, 3, 5])
+##      @result{} [1, 2, 3, 4, 5]
+## @end group
+## @end example
+##
+## If the optional third input argument is the string "rows" each row of
+## the matrices @var{x} and @var{y} will be considered an element of sets.
+## For example,
+## @example
+## @group
+## union([1, 2; 2, 3], [1, 2; 3, 4], "rows")
+##      @result{}  1   2
+##     2   3
+##     3   4
 ## @end group
 ## @end example
 ## @seealso{create_set, intersection, complement}
@@ -33,23 +46,31 @@
 
 ## Author: jwe
 
-function y = union(a,b)
+function y = union (a, b, varargin)
 
-  if (nargin != 2)
+  if (nargin < 2 || nargin > 3)
     print_usage ();
   endif
 
+  if (nargin == 3 && ! strcmpi (varargin{1}, "rows"))
+    error ("union: if a third input argument is present, it must be the string 'rows'");
+  endif
+
   if (isempty (a))
-    y = create_set (b);
+    y = create_set (b, varargin{:});
   elseif (isempty (b))
-    y = create_set (a);
-  else
+    y = create_set (a, varargin{:});
+  elseif (nargin == 2)
     y = create_set ([a(:); b(:)]);
     if (size (a, 1) == 1 || size (b, 1) == 1)
       y = y(:).';
     else
       y = y(:);
     endif
+  elseif (ndims (a) == 2 && ndims (b) == 2 && columns (a) == columns (b))
+    y = create_set ([a; b], "rows");
+  else
+    error ("union: input arguments must contain the same number of columns when \"rows\" is specified");
   endif
 
 endfunction