diff scripts/set/setxor.m @ 5825:f3e37beb03aa

[project @ 2006-05-19 16:13:52 by jwe]
author jwe
date Fri, 19 May 2006 16:13:52 +0000
parents
children 34f96dd5441b
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/scripts/set/setxor.m
@@ -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])