MathGroup Archive 1998

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

Search the Archive

Re: Thread



Des Penny wrote:
> 
> Hi Groupers:
> 
> I've written a program to calculate the forces on charged particles. The
> program works well except that parts are less than elegant.  The key
> questions I have concern the Thread function:
> 
> ==========================================
> 
> Question 1:
> ------------
> 
> In[1]:=
> Thread[f[a,{b,c}]]
> 
> Out[1]=
> {f[a,b],f[a,c]}
> 
> We see that if "a" does not have head "List" it is automatically
> replicated so that Thread works.
> Now if a, b and c are defined as follows:
> 
> In[2]:=
> a={q1,{x1,y1,z1}};b={q2,{x2,y2,z2}};c={q3,{x3,y3,z3}};
> 
> I would LIKE to have the following output when I apply Thread:
> 
> {f[{q1,{x1,y1,z1}},{q2,{x2,y2,z2}}],f[{q1,{x1,y1,z1}},{q3,{x3,y3,z3}]}
> 
> However, since "a" now has head "List", Thread now gives me:
> 
> In[3]:=
> Thread[f[a,{b,c}]]
> 
> Out[3]=
> {f[q1,{q2,{x2,y2,z2}}],f[{x1,y1,z1},{q3,{x3,y3,z3}}]}
> 
> Is there a way to force Thread to give me what I want?


a={q1,{x1,y1,z1}};b={q2,{x2,y2,z2}};c={q3,{x3,y3,z3}};


Thread[f[a,{b,c}],List,{2}] (*thread over List at positin 2 only*)

{f[{q1,{x1,y1,z1}},{q2,{x2,y2,z2}}],f[{q1,{x1,y1,z1}},{q3,{x3,y3,z3}}]}


> ================================================================
> 
> Question 2:
> -------------
> 
> I would like to be able to Thread g across two lists as follows:
> 
> In[1]:=
> ccs={a,b}; oc={x,y};
>  Thread[g[ccs,oc]]
> 
> Out[1]=
> {g[a,x],g[b,y]}
> 
> But unfortunately, since ccs and oc are lists, and since g is designed
> to operate on lists, g executes before the thread takes place.
> 
> If g is undefined everything is ok:
> 
> In[3]:=
> a={a1,a2}; b={b1,b2};  x={x1,x2}; y={y1,y2}; Thread[g[ccs,oc]]
> 
> Out[3]=
> {g[{a1,a2},{x1,x2}],g[{b1,b2},{y1,y2}]}
> 
> If I now define g:
> 
> In[4]:=
> g[x1_List,x2_List]:=x1+x2^2
> 
> I would now LIKE the output of the Thread statement to be:
> 
> In[6]:=
> {g[{a1,a2},{x1,x2}],g[{b1,b2},{y1,y2}]}
> 
> Out[6]=
> {{a1 + x1^2, a2 + x2^2}, {b1 + y1^2, b2 + y2^2}}
> 
> Instead the Thread statement now gives me:
> 
> In[7]:=
> Thread[g[ccs,oc]]
> 
> Out[7]=
> {{a1 + x1^2, b1 + y1^2}, {a2 + x2^2, b2 + y2^2}}


a={a1,a2}; b={b1,b2};  x={x1,x2}; y={y1,y2};

g[x1_List,x2_List]:=x1+x2^2


MapThread[g,{ccs,oc}]

         2         2           2         2 {{a1 + x1 , a2 + x2 }, {b1 +
y1 , b2 + y2 }}


-- 
Allan Hayes
Mathematica Training and Consulting
Leicester, UK
hay@haystack.demon.co.uk
http://www.haystack.demon.co.uk
voice: +44 (0)116 271 4198
fax: +44 (0)116 271 8642




  • Prev by Date: Binary files
  • Next by Date: Re: How can I run Mathematica 2.1E on a PowerMac?
  • Prev by thread: Thread
  • Next by thread: Re: Display - Funkion