From bug-request at octave dot org Tue Dec 14 07:59:33 2004 Subject: intersect patch From: "Hall, Benjamin" To: "'bug at octave dot org'" Date: Tue, 14 Dec 2004 07:31:49 -0600 (Try 2) I have made some modifications to the octave-forge intersect function so that it now returns up to 3 results: [c,ia,ib] = intersect( a, b ) where the two new return vectors are the index vectors such that a(ia) == b(ib) == c. This will improve compatibility with the Matlab function of the same name. Below are the diffs, let me know if I should submit / identify things differently (its my first time!) Ben *** intersect.m,orig 2004-12-14 08:29:21.000000000 -0500 --- intersect.m 2004-12-14 08:56:51.000000000 -0500 *************** *** 21,49 **** ## order. If at var{a} and @var{b} are both column vectors return a column ## vector, otherwise return a row vector. ## ## at end deftypefn ## at seealso{unique, union, setxor, setdiff, ismember} ! function c = intersect(a,b) if ( nargin != 2 ) usage ("intersect (a, b)"); endif if ( isempty (a) || isempty (b) ) ! c = []; ! else ! ## form a and b into sets ! a = unique (a); ! b = unique (b); ! ! ## keep duplicates ! c = sort ([ a(:) ; b(:) ]); ! n = length(c); ! c = c (find (c(1:n-1) == c(2:n))); ! if ( size (b, 1) == 1 || size (a, 1) == 1 ) ! c = c.'; ! endif endif endfunction --- 21,71 ---- ## order. If at var{a} and @var{b} are both column vectors return a column ## vector, otherwise return a row vector. ## + ## at deftypefnx {Function File} {[@var{c}, @var{ia}, @var{ib}] = } intersect ( at var{a}, @var{b}) + ## + ## Return index vectors at var{ia} and @var{ib} such that @code{a(ia)==c} and + ## at code{b(ib)==c} dot + ## ## at end deftypefn ## at seealso{unique, union, setxor, setdiff, ismember} ! function [c,ia,ib] = intersect(a,b) if ( nargin != 2 ) usage ("intersect (a, b)"); endif if ( isempty (a) || isempty (b) ) ! c = []; ia = []; ib = []; ! return; ! endif ! ## form a and b into sets ! [a,ja] = unique (a); ! [b,jb] = unique (b); ! ! c = [ a(:); b(:) ]; ! [c, ic] = sort( c ); ## [a(:);b(:)](ic) == c ! ! ii = find( c(1:end-1) == c(2:end) ); ! ! c = c(ii); ## The answer ! ia = ja(ic(ii)); ## a(ia) == c ! ib = jb(ic(ii+1) - length(a)); ## b(ib) == c + + if ( size (b, 1) == 1 || size (a, 1) == 1 ) + c = c.'; endif + + endfunction + + + %!# Test the routine for index vectors ia and ib + %!test + %! a = [3 2 4 5 7 6 5 1 0 13 13]; + %! b = [3 5 12 1 1 7]; + %! [c,ia,ib] = intersect(a,b); + %!assert( c,[1 3 5 7]); + %!assert(ia,[8 1 7 5]); + %!assert(ib,[5 1 2 6]); ------------------------------------------------------------- Octave is freely available under the terms of the GNU GPL. Octave's home on the web: http://www.octave.org How to fund new projects: http://www.octave.org/funding.html Subscription information: http://www.octave.org/archive.html -------------------------------------------------------------