RE:Help to clarify 'Map', 'Apply', and 'Thread'.
- To: mathgroup at smc.vnet.net
- Subject: [mg15709] RE:[mg15626] Help to clarify 'Map', 'Apply', and 'Thread'.
- From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
- Date: Fri, 5 Feb 1999 03:42:10 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
In response to a question from Wen-Feng Shaw I tried to demonstrate 'Map', 'Apply', 'Thread' and 'MapThread'. In retrospect I don't like the discussion I gave on MapThread. I give it another attempt below. *****MapThread****** MapThread can be used to Apply a function to each column of a matrix. In[1]:= mat={{a,b,c,d,e,f},{1,2,3,4,5,6}}; MapThread[foo,mat] Out[1]= {foo[a,1],foo[b,2],foo[c,3],foo[d,4],foo[e,5],foo[f,6]} MapThread is equivalent to using Map followed by Apply at level 2 (see below). I have to wonder why it isn't called ApplyThread. If anyone is interested I could talk about "level specification" at another time. In[2]:= MapThread[foo,mat]===Apply[foo,Thread[mat],2] Out[2]= True __________________ Consider the use of MapThread on the tensor below. In[3]:= tensor={ {{a1,a2,a3,a4},{b1,b2,b3,b4}}, {{c1,c2,c3,c4},{d1,d2,d3,d4}}, {{e1,e2,e3,e4},{f1,f2,f3,f4}} }; Dimensions[tensor] Out[3]= {3,2,4} In[4]:= MapThread[foo,tensor] Out[4]={ foo[{a1,a2,a3,a4},{c1,c2,c3,c4},{e1,e2,e3,e4}], foo[{b1,b2,b3,b4},{d1,d2,d3,d4},{f1,f2,f3,f4}]} If you use MapThread on a tensor you may need to specify the level as a third argument. In the next line MapThread is used at level 2 and gives a very different result than the previous line. In[5]:= MapThread[foo,tensor,2] Out[5]= {{foo[a1,c1,e1],foo[a2,c2,e2], foo[a3,c3,e3],foo[a4,c4,e4]}, {foo[b1,d1,f1],foo[b2,d2,f2], foo[b3,d3,f3],foo[b4,d4,f4]}} ___________________ The next line is an interesting use of MapThread. Here we apply a list of functions to a list of arguments. In[6]:= funcs={f1, f2, f3}; values={val1,val2,val3}; MapThread[(#1[#2])&, {funcs,values}] Out[6]= {f1[val1],f2[val2],f3[val3]} ___________________ Alan Hayes once posted in this mathgroup something like the code below to make a list of replacement rules. Another interesting use of MapThread. In[7]:= pos=Array[p,{4,3}] Out[7]= {{p[1,1],p[1,2],p[1,3]}, {p[2,1],p[2,2],p[2,3]}, {p[3,1],p[3,2],p[3,3]}, {p[4,1],p[4,2],p[4,3]}} In[8]:= posval={{1,2,3},{4,5,6},{7,8,9},{11,12,13}}; Flatten[MapThread[Rule,{pos,posval},2]] Out[8]= {p[1, 1] -> 1, p[1, 2] -> 2, p[1, 3] -> 3, p[2, 1] -> 4, p[2, 2] -> 5, p[2, 3] -> 6, p[3, 1] -> 7, p[3, 2] -> 8, p[3, 3] -> 9, p[4, 1] -> 11, p[4, 2] -> 12, p[4, 3] -> 13} __________________ Cheers, Ted Ersek