Mathematica 9 is now available
Previous section-----Next section

2.2.4 Applying Functions to Parts of Expressions

If you have a list of elements, it is often important to be able to apply a function separately to each of the elements. You can do this in Mathematica using Map.

This applies f separately to each element in a list.

In[1]:=  Map[f, {a, b, c}]

Out[1]=

This defines a function which takes the first two elements from a list.

In[2]:=  take2[list_] := Take[list, 2]

You can use Map to apply take2 to each element of a list.

In[3]:=  Map[take2, {{1, 3, 4}, {5, 6, 7}, {2, 1, 6, 6}}]

Out[3]=

Map[f, {a, b, ... }] apply f to each element in a list, giving {f[a], f[b], ... }

Applying a function to each element in a list.

What Map[f, expr] effectively does is to "wrap" the function f around each element of the expression expr. You can use Map on any expression, not just a list.

This applies f to each element in the sum.

In[4]:=  Map[f, a + b + c]

Out[4]=

This applies Sqrt to each argument of g.

In[5]:=  Map[Sqrt, g[x^2, x^3]]

Out[5]=

Map[f, expr] applies f to the first level of parts in expr. You can use MapAll[f, expr] to apply f to all the parts of expr.

This defines a  matrix m.

In[6]:=  m = {{a, b}, {c, d}}

Out[6]=

Map applies f to the first level of m, in this case the rows of the matrix.

In[7]:=  Map[f, m]

Out[7]=

MapAll applies f at all levels in m. If you look carefully at this expression, you will see an f wrapped around every part.

In[8]:=  MapAll[f, m]

Out[8]=

In general, you can use level specifications as described in Section 2.1.7 to tell Map to which parts of an expression to apply your function.

This applies f only to the parts of m at level 2.

In[9]:=  Map[f, m, {2}]

Out[9]=

Setting the option Heads->True wraps f around the head of each part, as well as its elements.

In[10]:=  Map[f, m, Heads->True]

Out[10]=

Map[f, expr] or f /@ expr apply f to the first-level parts of expr
MapAll[f, expr] or f //@ expr apply f to all parts of expr
Map[f, expr, lev] apply f to each part of expr at levels specified by lev

Ways to apply a function to different parts of expressions.

Level specifications allow you to tell Map to which levels of parts in an expression you want a function applied. With MapAt, however, you can instead give an explicit list of parts where you want a function applied. You specify each part by giving its indices, as discussed in Section 2.1.4.

Here is a  matrix.

In[11]:=  mm = {{a, b, c}, {b, c, d}}

Out[11]=

This applies f to parts {1, 2} and {2, 3}.

In[12]:=  MapAt[f, mm, {{1, 2}, {2, 3}}]

Out[12]=

This gives a list of the positions at which b occurs in mm.

In[13]:=  Position[mm, b]

Out[13]=

You can feed the list of positions you get from Position directly into MapAt.

In[14]:=  MapAt[f, mm, %]

Out[14]=

To avoid ambiguity, you must put each part specification in a list, even when it involves only one index.

In[15]:=  MapAt[f, {a, b, c, d}, {{2}, {3}}]

Out[15]=

MapAt[f, expr, { ,  , ... }] apply f to specified parts of expr

Applying a function to specific parts of an expression.
Here is an expression.

In[16]:=  t = 1 + (3 + x)^2 / x

Out[16]=

This is the full form of t.

In[17]:=  FullForm[ t ]

Out[17]//FullForm=

You can use MapAt on any expression. Remember that parts are numbered on the basis of the full forms of expressions.

In[18]:=  MapAt[f, t, {{2, 1, 1}, {2, 2}}]

Out[18]=

MapIndexed[f, expr] apply f to the elements of an expression, giving the part specification of each element as a second argument to f
MapIndexed[f, expr, lev] apply f to parts at specified levels, giving the list of indices for each part as a second argument to f

Applying a function to parts and their indices.
This applies f to each element in a list, giving the index of the element as a second argument to f.

In[19]:=  MapIndexed[f, {a, b, c}]

Out[19]=

This applies f to both levels in a matrix.

In[20]:=  MapIndexed[f, {{a, b}, {c, d}}, 2]

Out[20]=

Map allows you to apply a function of one argument to parts of an expression. Sometimes, however, you may instead want to apply a function of several arguments to corresponding parts of several different expressions. You can do this using MapThread.

MapThread[f, { ,  , ... }] apply f to corresponding elements in each of the
MapThread[f, { ,  , ... }, lev]
apply f to parts of the  at the specified level

Applying a function to several expressions at once.
This applies f to corresponding pairs of list elements.

In[21]:=  MapThread[f, {{a, b, c}, {ap, bp, cp}}]

Out[21]=

MapThread works with any number of expressions, so long as they have the same structure.

In[22]:=  MapThread[f, {{a, b}, {ap, bp}, {app, bpp}}]

Out[22]=

Functions like Map allow you to create expressions with parts modified. Sometimes you simply want to go through an expression, and apply a particular function to some parts of it, without building a new expression. A typical case is when the function you apply has certain "side effects", such as making assignments, or generating output.

Scan[f, expr] evaluate f applied to each element of expr in turn
Scan[f, expr, lev] evaluate f applied to parts of expr on levels specified by lev

Evaluating functions on parts of expressions.
Map constructs a new list in which f has been applied to each element of the list.

In[23]:=  Map[f, {a, b, c}]

Out[23]=

Scan evaluates the result of applying a function to each element, but does not construct a new expression.

In[24]:=  Scan[Print, {a, b, c}]




Scan visits the parts of an expression in a depth-first walk, with the leaves visited first.

In[25]:=  Scan[Print, 1 + x^2, Infinity]







Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.