MathGroup Archive 2004

[Date Index] [Thread Index] [Author Index]

Search the Archive

RE: Building a list

  • To: mathgroup at smc.vnet.net
  • Subject: [mg47195] RE: [mg47114] Building a list
  • From: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.com>
  • Date: Mon, 29 Mar 2004 04:22:41 -0500 (EST)
  • Sender: owner-wri-mathgroup at wolfram.com

>-----Original Message-----
>From: Mark Coleman [mailto:mark at markscoleman.com]
To: mathgroup at smc.vnet.net
>Sent: Friday, March 26, 2004 9:56 AM
>To: mathgroup at smc.vnet.net
>Subject: [mg47195] [mg47114] Building a list
>
>
>Greetings,
>
>I've got a relatively simple function f[a_,b_,c_,d_], where a 
>and b are  
>integers and c and d are lists (of reals), and f returns a real.
>
>I need to evaluate f on (potentially long) sets of lists and 
>calculate  
>a square "matrix" from the possible permutations of the 
>elements in the  
>lists. For instance
>
>If
>
>xlist={x1,x2,x3}
>
>
>I need to calculate
>
>{{f[a,b,x1,x1],f[a,b,x1,x2],f[a,b,x1,x3]},{f[a,b,x2,x1],f[a,b,x
>2,x2],f[a 
>,b,x2,x3]},{f[a,b,x3,x1],f[a,b,x3,x2],f[a,b,x3,x3]}}
>
>Note that f[a,b,c,d] does not equal f[a,b,d,c].
>
>My first reaction was that Outer[] might do this, but I cannot 
>seem to  
>get it to work. I'd appreciate any suggestions.
>
>Thanks,
>
>Mark
>


The optimal solution depends a bit on the format of the result. If you don't
need a resulting  matrix structure prefer Distribute:

 
In[1]:= l = {x1, x2, x3};

In[2]:=  Outer[f[a, b, ##] &, l, l]
Out[2]=
{{f[a, b, x1, x1], f[a, b, x1, x2], f[a, b, x1, x3]},
 {f[a, b, x2, x1], f[a, b, x2, x2], f[a, b, x2, x3]},
 {f[a, b, x3, x1], f[a, b, x3, x2], f[a, b, x3, x3]}}

In[3]:= Distribute[f[a, b, l, l], List]
Out[3]=
{f[a, b, x1, x1], f[a, b, x1, x2], f[a, b, x1, x3],
 f[a, b, x2, x1], f[a, b, x2, x2], f[a, b, x2, x3],
 f[a, b, x3, x1], f[a, b, x3, x2], f[a, b, x3, x3]}



For large lists look at:
 
In[4]:= ll = Table[Unique[x], {1000}];

In[5]:= (r2 = Distribute[f[a, b, ll, ll], List]); // Timing
Out[5]= {3.826 Second, Null}

In[6]:= (r2 = Partition[r2, 1000]); // Timing
Out[6]= {1.141 Second, Null}

In[7]:= (r1 = Outer[f[a, b, ##] &, ll, ll]); // Timing
Out[7]= {9.143 Second, Null}

In[8]:= r1 === r2
Out[8]= True


So Distribute-ing and then Partition-ing is faster than Outer (at not packed
arrays, at least).

--
Hartmut Wolf


  • Prev by Date: Re: Yet another simple question.
  • Next by Date: Re: Re: Length of actual parameters in a function call.
  • Previous by thread: RE: Building a list
  • Next by thread: Assumption -> quadratic multivariate function