Re: Select from Tuplet using logical expression
- To: mathgroup at smc.vnet.net
- Subject: [mg116990] Re: Select from Tuplet using logical expression
- From: Heike Gramberg <heike.gramberg at gmail.com>
- Date: Sun, 6 Mar 2011 05:45:51 -0500 (EST)
On 5 Mar 2011, at 11:08, Peter Pein wrote: > Am 04.03.2011 09:40, schrieb Ray Koopman: >> On Mar 1, 2:27 am, Lengyel Tamas<lt... at hszk.bme.hu> wrote: >>> Hello. >>> >>> Skip if needed: >>> ///I am working on a part combinatorical problem with sets of 3 >>> differently indexed values (e.g. F_i, F_j, F_k, F denoting frequency >>> channels) which are subsets of many values (e.g 16 different frequency >>> channels, denoted F_0, F_1 ... F_15). >>> >>> Now, I need to select triplets from these channels, I used Tuplets. So far >>> so good. From these I need those combinations where indexes i!=k and/or >>> j!=k, and i=j is allowed (e.g {i,j,k} = {12, 12, 4} is a valid channel >>> combination, but {3, 12, 3} is not)./// >>> >>> So basically I need to generate triplets from a range of integer numbers, >>> where the first and second elements of these triplets do not match the >>> third. I thought Select would help, but I don't know if there exists an >>> option to control elements' values in a condition. >>> >>>> From then on I must use these triplets' elements in a function. >>> >>> But first I am asking your help in generating thos triplets of numbers. >>> >>> Thanks. >>> >>> Tam s Lengyel >> >> 1 - 6 have been posted previously. 7 is new, a modification of 6. >> 1 - 5 generate all the triples, then delete unwanted ones. >> 6& 7 generate only the triples that are wanted. >> >> The time differences seem to be reliable. >> >> r = Range[32]; >> AbsoluteTiming[t1 = Select[Tuples[r,3], >> #[[1]]!=#[[3]]&& #[[2]]!=#[[3]]&]; "1"] >> AbsoluteTiming[t2 = Select[Tuples[r,3], >> FreeQ[Most@#,Last@#]&]; "2"] >> AbsoluteTiming[t3 = Cases[Tuples[r,3], >> _?(FreeQ[Most@#,Last@#]&)]; "3"] >> AbsoluteTiming[t4 = DeleteCases[Tuples[r,3], >> _?(MemberQ[Most@#,Last@#]&)]; "4"] >> AbsoluteTiming[t5 = DeleteCases[Tuples[r,3], >> {k_,_,k_}|{_,k_,k_}]; "5"] >> AbsoluteTiming[t6 = Flatten[Function[ij,Append[ij,#]&/@ >> Complement[r,ij]] /@ Tuples[r,2], 1]; "6"] >> AbsoluteTiming[t7 = Flatten[Outer[Append,{#}, >> Complement[r,#],1]& /@ Tuples[r,2], 2]; "7"] >> SameQ[t1,t2,t3,t4,t5,t6,t7] >> >> {0.378355 Second, 1} >> {0.390735 Second, 2} >> {0.409103 Second, 3} >> {0.420442 Second, 4} >> {0.140180 Second, 5} >> {0.128378 Second, 6} >> {0.085107 Second, 7} >> True >> > > Ray, > > you might want to add > > AbsoluteTiming[t8=Flatten/@Flatten[(Distribute[{{#1},Complement[r,#1]},List]&)/@Tuples[r,{2}],1];"8"] > > which needs ~95% of the time needed to calculate t7. > > Peter > You could also do AbsoluteTiming[ t9 = Flatten[ Map[(Tuples[{Complement[r, {#}], Complement[r, {#}], {#}}]) &, r], 1]; "9"] That seems to be about twice as fast as t8, although t9 is in a different order from t1-t8 (SameQ[t1, t2, t3, t4, t5, t6, t7, t8, Sort[t9]] is still True though). Heike.