Re: Newbie question: pairswise function application
- To: mathgroup at smc.vnet.net
- Subject: [mg23895] Re: Newbie question: pairswise function application
- From: Hartmut Wolf <hwolf at debis.com>
- Date: Thu, 15 Jun 2000 00:51:35 -0400 (EDT)
- Organization: debis Systemhaus
- References: <8i1t6n$jn9@smc.vnet.net> <Pine.GSO.4.21.0006131745370.18990-100000@flip.eecs.umich.edu>
- Sender: owner-wri-mathgroup at wolfram.com
Dear Daniel, short code, but the package doesn't do well (for k=2); alternatively I'd like to propose: In[19]:= l = {1, 5, 19, 100}; In[20]:= MapThread[Function[y, f[#1, y]] /@ #2 &, Through[{First, Rest}[NestList[Rest, list, Length[list]]]]] // Flatten Out[20]= {f[1, 5], f[1, 19], f[1, 100], f[5, 19], f[5, 100], f[19, 100]} to compare performance: In[40]:= $RecursionLimit = 1000 (* !!! *) In[52]:= Print[Timing[MapThread[Function[y, Times[#1, y]] /@ #2 &, Through[{First, Rest}[NestList[Rest, #, Length[#]]]]] // Flatten][[1]]] & /@ (Range[100 #] & /@ Range[8]); >From In[52]:= 0.391 Second >From In[52]:= 0.641 Second >From In[52]:= 0.941 Second >From In[52]:= 1.482 Second >From In[52]:= 2.103 Second >From In[52]:= 2.924 Second >From In[52]:= 3.776 Second >From In[52]:= 4.857 Second whereas In[53]:= Print[Timing[Times @@@ KSubsets[#, 2]][[1]]] & /@ (Range[100 #] & /@ Range[8]); >From In[53]:= 0.961 Second >From In[53]:= 2.373 Second >From In[53]:= 5.008 Second >From In[53]:= 8.983 Second >From In[53]:= 14.25 Second >From In[53]:= 21.371 Second >From In[53]:= 30.333 Second >From In[53]:= 41.349 Second Kind regards, Hartmut Wolf Daniel Reeves schrieb: > > Needs["DiscreteMath`Combinatorica`"]; > > ?KSubsets > "KSubsets[l, k] gives all subsets of set l containing exactly k elements, > ordered lexicographically." > > pairs = KSubsets[{1, 5, 19, 100}, 2] > {{1, 5}, {1, 19}, {1, 100}, {5, 19}, {5, 100}, {19, 100}} > > f @@@ pairs (* replace @@@ with @@#&/@ for version < 4 *) > {f[1, 5], f[1, 19], f[1, 100], f[5, 19], f[5, 100], f[19, 100]} > > Note that KSubsets, in the case of pairs, works by prepending the first > element to each of the Rest of the elements, and then recursively calling > on the Rest of the list. > > -- -- -- -- -- -- -- -- -- -- -- -- > Daniel Reeves http://ai.eecs.umich.edu/people/dreeves/ > > "Try identifying the problem and then solving it." > -- suggestion from Dilbert's boss > > --- \/ FROM Sidney Cadot ON 00.06.12 01:41 (Yesterday) \/ --- > > > Hi, > > > > Wandering through the 1500-odd pages of the Mathematica book, I can't > > find the solution to the following rather silly problem: > > > > I have a list L consisting of (a lot of) integers, and I want to apply a > > function f to all pairs of numbers; furthermore, I don't want to > > calculate both f[a,b] and f[b,a]: > > > > L = {1,5,19,100}; > > > > ... and I want: > > > > { f[1,5], f[1,19], f[1,100], f[5,19], f[5,100], f[19,100] } > > > > Can anyone please tell me how to do this? I'd prefer a smart solution > > (i.e., not just generating all pairs, then throwing away a lot of them) > > since my lists tend to get rather large. > > > > Thanks in advance, > > > > Sidney Cadot > > sidney at janis.pds.twi.tudelft.nl > >