--- setdiff.m.old 2006-05-01 08:28:29.000000000 -0400 +++ setdiff.m 2006-05-01 08:53:14.000000000 -0400 @@ -28,12 +28,23 @@ ## Author: Paul Kienzle ## Adapted-by: jwe -function c = setdiff (a, b) +function c = setdiff (a, b, byrows) - if (nargin != 2) - usage ("setdiff (a, b)"); + if (nargin < 2) + usage ("setdiff (a, b) or setdiff (a, b, 'rows')"); endif + if (nargin > 2) + if (isempty (strmatch (byrows, "rows", "exact"))) + error("Third input can only be 'rows'"); + else + byrows = 1; + endif + else + byrows = 0; + endif + + if (byrows == 0) c = unique (a); if (! isempty (c) && ! isempty (b)) ## Form a and b into combined set. @@ -47,6 +58,24 @@ c = c.'; endif endif + endif ## if (byrows == 0) + if (byrows == 1) + c = unique (a, "rows"); + if (! isempty (c) && ! isempty (b)) + ## Form a and b into combined set. + b = unique (b, "rows"); + [dummy, idx] = sortrows ([c; b]); + ## Eliminate those elements of a that are the same as in b. + n = length (dummy); + c(idx(find (dummy(1:n-1) == dummy(2:n))), :) = []; + endif + endif + endfunction +%!assert(setdiff(["bb";"zz";"bb";"zz"],["bb";"cc";"bb"],"rows"), "zz") +%!assert(setdiff(["b";"z";"b";"z"],["b";"c";"b"],"rows"), "z") +%!assert(setdiff(["b";"z";"b";"z"],["b";"c";"b"]), "z") +%!assert(setdiff([1, 1; 2, 2; 3, 3; 4, 4], [1, 1; 2, 2; 4, 4], "rows"), [3 3]) +%!assert(setdiff([1; 2; 3; 4], [1; 2; 4], "rows"), 3)