RE: Help to clarify 'Map', 'Apply', and 'Thread'.
- To: mathgroup at smc.vnet.net
- Subject: [mg15702] RE: [mg15626] Help to clarify 'Map', 'Apply', and 'Thread'.
- From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
- Date: Mon, 1 Feb 1999 14:54:19 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
Wen-Feng Shaw wrote:
The functions 'Map', 'Apply', 'Thread', and 'MapThread' are very
useful. However, I am often confused by their functionalities. I often
should stop to try if a certain expression is correct before coding it
into my program. Could you help me to clarify them? Thanks a lot!
_________________________
Before I begin I have a question for others: The third argument of
Thread can be an integer (positive or negative) or a list of such
integers, but I don't what this might do for you. If anyone knows
please explain.
First I clear all global variables.
In[1]:=
ClearAll["Global`*"];
Map is used to evaluate a function on each and every argument.
In[2]:=
Map[g,f[a1,a2,a3,a4]]
Out[2]=
f[g[a1],g[a2],g[a3],g[a4]]
The next line does the same thing using short hand notation.
In[3]:=
g/@f[a1,a2,a3,a4]
Out[3]=
f[g[a1],g[a2],g[a3],g[a4]]
Apply is used to change the head of an expression.
In[4]:=
Apply[g,f[a1,a2,a3,a4]]
Out[4]=
g[a1,a2,a3,a4]
The next line does the same thing using short hand notation.
In[5]:=
g@@f[a1,a2,a3,a4]
Out[5]=
g[a1,a2,a3,a4]
Note:
Map, Apply can take a level specification, but that's a complicated
subject and could be discussed in another response.
___________________
You are familiar with the command to take the Transpose of a matrix.
Right?
In[6]:=
Transpose[{{a1,a2,a3},{b1,b2,b3}}]
Out[6]=
{{a1,b1},{a2,b2},{a3,b3}}
Thread is analogous to Transpose.
In[7]:=
Thread[f[{a1,a2,a3},{b1,b2,b3}]]
Out[7]=
{f[a1,b1],f[a2,b2],f[a3,b3]}
The head at level 2 of the expression 'Thread' works on can be something
besides 'List', but you have to tell Thread what it is as a second
argument.
In[8]:=
Thread[f[g[a1,a2,a3],g[b1,b2,b3]],g] Out[8]=
g[f[a1,b1],f[a2,b2],f[a3,b3]]
The next line demonstrates that Thread is very flexible.
In[9]:=
Thread[f[x1,g[a1,a2,a3],x3],g]
Out[9]=
g[f[x1,a1,x3],f[x1,a2,x3],f[x1,a3,x3]]
Note:
As I said at the beginning the third argument of Thread can be an
integer (positive or negative) or a list of such integers, but I don't
know what this might do for you.
___________________
MapThread is like using 'Thread' followed by use of 'Map'.
In[10]:=
MapThread[f,{{a1,a2,a3,a4},{b1,b2,b3,b4},{c1,c2,c3,c4}}] Out[10]=
{f[a1,b1,c1],f[a2,b2,c2],f[a3,b3,c3],f[a4,b4,c4]}
The third argument given to MapThread tells it what level to use. This
is a little hard to describe, but I will let you compare the results in
the next two examples and try to figure it out. Also note the level
can be negative, but that's a little off the subject. Negative "level"
could be addressed in another response.
In[11]:=
MapThread[f,{{{a1,a2,a3,a4},{b1,b2,b3,b4},{c1,c2,c3,c4}}}] Out[11]=
{f[{a1,a2,a3,a4}],f[{b1,b2,b3,b4}],f[{c1,c2,c3,c4}]}
In[12]:=
MapThread[f,{{{a1,a2,a3,a4},{b1,b2,b3,b4},{c1,c2,c3,c4}}},2] Out[12]=
{{f[a1],f[a2],f[a3],f[a4]},{f[b1],f[b2],f[b3],f[b4]},{f[c1],f[c2],f[c3],f[c4
]}}
Note:
You might also look at MapIndexed, MapAll, MapAt. Using MapIndexed is a
little tricky and I could discuss that if anyone is interested.
Cheers,
Ted Ersek