# HG changeset patch # User Rik # Date 1514505369 28800 # Node ID e8d0573279b2b6943fb7d08d5072c4ff5d473ef0 # Parent 6ea279bbe94a57dcf7ed7fafc171c8cdcc8c4b02 maint: move xor.m from miscellaneous to general directory. * scripts/general/xor.m: Moved from miscellaneous/ dir. * scripts/general/module.mk, scripts/miscellaneous/module.mk: Update build system. diff -r 6ea279bbe94a -r e8d0573279b2 scripts/general/module.mk --- a/scripts/general/module.mk Thu Dec 28 15:25:48 2017 -0800 +++ b/scripts/general/module.mk Thu Dec 28 15:56:09 2017 -0800 @@ -85,7 +85,8 @@ %reldir%/subsindex.m \ %reldir%/trapz.m \ %reldir%/triplequad.m \ - %reldir%/validateattributes.m + %reldir%/validateattributes.m \ + %reldir%/xor.m %canon_reldir%dir = $(fcnfiledir)/general diff -r 6ea279bbe94a -r e8d0573279b2 scripts/general/xor.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/general/xor.m Thu Dec 28 15:56:09 2017 -0800 @@ -0,0 +1,100 @@ +## Copyright (C) 1995-2017 Kurt Hornik +## +## 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 3 of the License, 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, see +## . + +## -*- texinfo -*- +## @deftypefn {} {@var{z} =} xor (@var{x}, @var{y}) +## @deftypefnx {} {@var{z} =} xor (@var{x1}, @var{x2}, @dots{}) +## Return the @dfn{exclusive or} of @var{x} and @var{y}. +## +## For boolean expressions @var{x} and @var{y}, +## @code{xor (@var{x}, @var{y})} is true if and only if one of @var{x} or +## @var{y} is true. Otherwise, if @var{x} and @var{y} are both true or both +## false, @code{xor} returns false. +## +## The truth table for the xor operation is +## +## @multitable @columnfractions 0.44 .03 .05 .03 0.44 +## @item @tab @var{x} @tab @var{y} @tab @var{z} @tab +## @item @tab - @tab - @tab - @tab +## @item @tab 0 @tab 0 @tab 0 @tab +## @item @tab 1 @tab 0 @tab 1 @tab +## @item @tab 0 @tab 1 @tab 1 @tab +## @item @tab 1 @tab 1 @tab 0 @tab +## @end multitable +## +## If more than two arguments are given the xor operation is applied +## cumulatively from left to right: +## +## @example +## (@dots{}((x1 XOR x2) XOR x3) XOR @dots{}) +## @end example +## +## @seealso{and, or, not} +## @end deftypefn + +## Author: KH +## Created: 16 September 1994 +## Adapted-By: jwe + +function z = xor (x, y, varargin) + + if (nargin < 2) + print_usage (); + endif + + z = __xor__ (x, y); + + ## Slow expansion to multiple arguments. + ## Probably okay number of elements will be small. + if (! isempty (varargin)) + for i = 1:numel (varargin) + z = __xor__ (z, varargin{i}); + endfor + endif + +endfunction + +function z = __xor__ (x, y) + + if (isscalar (x) || isscalar (y) || size_equal (x, y)) + ## Typecast to logicals is necessary for other numeric types. + z = logical (x) != logical (y); + else + try + z = bsxfun (@xor, x, y); + catch + error ("xor: X and Y must be of compatible size or scalars"); + end_try_catch + endif + +endfunction + + +%!assert (xor ([1, 1, 0, 0], [0, 1, 0, 1]), logical ([1, 0, 0, 1])) +%!assert (xor ([i, i, 0, 0], [1, 0, 1, 0]), logical ([0, 1, 1, 0])) + +%!assert (xor (eye (2), fliplr (eye (2))), logical (ones (2))) +%!assert (xor (speye (2), fliplr (speye (2))), sparse (logical (ones (2)))) + +## Test XOR reduction +%!assert (xor ([1 0], [1 1], [0 0]), logical ([0 1])) + +## Test input validation +%!error xor () +%!error xor (1) +%!error xor (ones (3,2), ones (2,3)) diff -r 6ea279bbe94a -r e8d0573279b2 scripts/miscellaneous/module.mk --- a/scripts/miscellaneous/module.mk Thu Dec 28 15:25:48 2017 -0800 +++ b/scripts/miscellaneous/module.mk Thu Dec 28 15:56:09 2017 -0800 @@ -66,7 +66,6 @@ %reldir%/ver.m \ %reldir%/version.m \ %reldir%/what.m \ - %reldir%/xor.m \ %reldir%/zip.m %canon_reldir%dir = $(fcnfiledir)/miscellaneous diff -r 6ea279bbe94a -r e8d0573279b2 scripts/miscellaneous/xor.m --- a/scripts/miscellaneous/xor.m Thu Dec 28 15:25:48 2017 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -## Copyright (C) 1995-2017 Kurt Hornik -## -## 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 3 of the License, 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, see -## . - -## -*- texinfo -*- -## @deftypefn {} {@var{z} =} xor (@var{x}, @var{y}) -## @deftypefnx {} {@var{z} =} xor (@var{x1}, @var{x2}, @dots{}) -## Return the @dfn{exclusive or} of @var{x} and @var{y}. -## -## For boolean expressions @var{x} and @var{y}, -## @code{xor (@var{x}, @var{y})} is true if and only if one of @var{x} or -## @var{y} is true. Otherwise, if @var{x} and @var{y} are both true or both -## false, @code{xor} returns false. -## -## The truth table for the xor operation is -## -## @multitable @columnfractions 0.44 .03 .05 .03 0.44 -## @item @tab @var{x} @tab @var{y} @tab @var{z} @tab -## @item @tab - @tab - @tab - @tab -## @item @tab 0 @tab 0 @tab 0 @tab -## @item @tab 1 @tab 0 @tab 1 @tab -## @item @tab 0 @tab 1 @tab 1 @tab -## @item @tab 1 @tab 1 @tab 0 @tab -## @end multitable -## -## If more than two arguments are given the xor operation is applied -## cumulatively from left to right: -## -## @example -## (@dots{}((x1 XOR x2) XOR x3) XOR @dots{}) -## @end example -## -## @seealso{and, or, not} -## @end deftypefn - -## Author: KH -## Created: 16 September 1994 -## Adapted-By: jwe - -function z = xor (x, y, varargin) - - if (nargin < 2) - print_usage (); - endif - - z = __xor__ (x, y); - - ## Slow expansion to multiple arguments. - ## Probably okay number of elements will be small. - if (! isempty (varargin)) - for i = 1:numel (varargin) - z = __xor__ (z, varargin{i}); - endfor - endif - -endfunction - -function z = __xor__ (x, y) - - if (isscalar (x) || isscalar (y) || size_equal (x, y)) - ## Typecast to logicals is necessary for other numeric types. - z = logical (x) != logical (y); - else - try - z = bsxfun (@xor, x, y); - catch - error ("xor: X and Y must be of compatible size or scalars"); - end_try_catch - endif - -endfunction - - -%!assert (xor ([1, 1, 0, 0], [0, 1, 0, 1]), logical ([1, 0, 0, 1])) -%!assert (xor ([i, i, 0, 0], [1, 0, 1, 0]), logical ([0, 1, 1, 0])) - -%!assert (xor (eye (2), fliplr (eye (2))), logical (ones (2))) -%!assert (xor (speye (2), fliplr (speye (2))), sparse (logical (ones (2)))) - -## Test XOR reduction -%!assert (xor ([1 0], [1 1], [0 0]), logical ([0 1])) - -## Test input validation -%!error xor () -%!error xor (1) -%!error xor (ones (3,2), ones (2,3))