Re: Select from Tuplet using logical expression
- To: mathgroup at smc.vnet.net
- Subject: [mg116910] Re: Select from Tuplet using logical expression
- From: Ray Koopman <koopman at sfu.ca>
- Date: Fri, 4 Mar 2011 03:39:10 -0500 (EST)
- References: <ikihne$7sk$1@smc.vnet.net>
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