changeset 5825:f3e37beb03aa

[project @ 2006-05-19 16:13:52 by jwe]
author jwe
date Fri, 19 May 2006 16:13:52 +0000
parents 448f9982e7fb
children 6c6ff9b82577
files scripts/ChangeLog scripts/set/setxor.m
diffstat 2 files changed, 58 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/ChangeLog	Fri May 19 06:53:31 2006 +0000
+++ b/scripts/ChangeLog	Fri May 19 16:13:52 2006 +0000
@@ -1,7 +1,7 @@
 2006-05-19  David Bateman  <dbateman@free.fr>
 
 	* polynomial/unmkpp.m, polynomial/mkpp.m, polynomial/spline.m,
-	polynomial/ppval.m: New files from Octave Forge.
+	polynomial/ppval.m, set/setxor.m: New files from Octave Forge.
 
 2006-05-17  John W. Eaton  <jwe@octave.org>
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/set/setxor.m	Fri May 19 16:13:52 2006 +0000
@@ -0,0 +1,57 @@
+## Copyright (C) 2000 Paul Kienzle
+##
+## This file is part of Octave.
+##
+## Octave is free software; you can redistribute it and/or modify it
+## under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2, or (at your option)
+## any later version.
+##
+## Octave is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with Octave; see the file COPYING.  If not, write to the Free
+## Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+## 02110-1301, USA.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} setxor (@var{a}, @var{b})
+##
+## Return the elements exclusive to @var{a} or @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.
+##
+## @seealso{unique, union, intersect, setdiff, ismember}
+## @end deftypefn
+
+function c = setxor (a, b)
+  if (nargin != 2)
+    usage ("setxor(a,b)");
+  endif
+
+  ## Form A and B into sets.
+  a = unique (a);
+  b = unique (b);
+
+  if (isempty (a))
+    c = b;
+  elseif (isempty (b))
+    c = a;
+  else
+    ## Reject duplicates.
+    c = sort ([a(:); b(:)]);
+    n = length (c);
+    idx = find (c(1:n-1) == c(2:n));
+    if (! isempty (idx))
+      c([idx, idx+1]) = [];
+    endif
+    if (size (a, 1) == 1 || size (b, 1) == 1)
+      c = c.';
+    endif
+  endif
+endfunction
+
+%!assert(setxor([1,2,3],[2,3,4]),[1,4])