Re: irritating little problem
- To: mathgroup at smc.vnet.net
- Subject: [mg32939] Re: [mg32906] irritating little problem
- From: Chris Johnson <cjohnson at shell.faradic.net>
- Date: Wed, 20 Feb 2002 01:26:22 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
This may not be too elegent, but it gets the job done. Actually, it only
catches pairs, so if something appears 3 times you get the 3 permutations
of matches. A little extra work might catch higher order matches.
matches[list_List] :=
Union[
Select[
Position[
Map[
If[First[#] == Last[#], #, Null] &,
Outer[List, list, list], {2}]
, x : {_, _}]
/. {x_, y_} :> {y, x} /; y < x,
First[#] != Last[#] &]];
In[60]:= list=Table[Random[Integer,{0,9}],{10}]
Out[60]= {4,3,3,3,4,6,1,5,5,2}
In[61]:= matches[list]
Out[61]= {{1,5},{2,3},{2,4},{3,4},{8,9}}
It took me about 10 seconds to do a List of length 1000. Probably could
be sped up by cleaning up the duplicates of the Outer earlier.
Good luck!
Chris
On Tue, 19 Feb 2002, KIMIC Weijnitz Peter wrote:
> I have a simple vector
> and I want to find the position of elements that are equal.
>
> I.e I want to test the vector and find all cases of similar elements.
>
> Brute force is not what I want, it can be a long vector.
> Best regards
> Petr W
>