Part


Part[expr,0] is always the same as Head[expr], but Head is a bit faster since
it doesn't need to determine what part.  For example Part[1+π, 0] returns
Plus.

Part[1 + π, 0]

Plus


In the next cell we see the part at position (2,0) of the list {1,1+π} is
Plus.

Part[{1, 1 + π}, 2, 0]

Plus


In the next cell a matrix (m) is made and used in some examples below. Of
course the method demonstrated in the cells that follow can be used on any
expression not only matrices.

Clear["Global`*"] ;  m = {{x11, x12, x13, x14, x15}, {x21, x22, x23, x24, x2 ... 34, x35}, {x41, x42, x43, x44, x45}, {x51, x52, x53, x54, x55}} ;   MatrixForm[m]

( x11   x12   x13   x14   x15 )            x21   x22   x23   x24   x25         ... 32   x33   x34   x35            x41   x42   x43   x44   x45            x51   x52   x53   x54   x55


Part has a powerful feature that many users aren't aware of.  The expression
m[[list1,list2]] returns the sub-matrix of (m) formed by the intersection of
the rows given by list1 and the columns given by list2. The next cell gives
an example. This is probably the quickest way to get such a submatrix of (m).

m[[{1, 3, 4}, {2, 5}]] //MatrixForm

( x12   x15 )            x32   x35            x42   x45


m[[n,list2]] returns a list of elements at positions (list2) in row n. The
next cell gives an example.

m[[2, {1, 2, 5}]]

{x21, x22, x25}


Likewise m[[list1,n]] returns a list of elements at positions (list1) of
column n. The next cell gives an example.

m[[{1, 2, 5}, 2]]

{x12, x22, x52}

Use of the forms demonstrated above gives the fastest way to change  multiple parts of an expression provided the parts can be reached with this  method. Rob Knapp makes this point in a tutorial on Packed Arrays at   http://library.wolfram.com/database/TechNotes/391/.  In that tutorial he shows how this method gives a significant speed  advantage in an implementation of LUDecomposition. This method of changing  multiple values is demonstrated on simple examples in the cells below where  elements of the matrix (m) from above are changed.

Notice the use of All  inside Part is not available in Version 3 or earlier.

m[[All, 3]] = {a1, a2, a3, a4, a5} ;  MatrixForm[m]

( x11   x12   a1    x14   x15 )            x21   x22   a2    x24   x25         ... 32   a3    x34   x35            x41   x42   a4    x44   x45            x51   x52   a5    x54   x55

m[[2, All]] = {b1, b2, b3, b4, b5} ;  MatrixForm[m]

( x11   x12   a1    x14   x15 )            b1    b2    b3    b4    b5          ... 32   a3    x34   x35            x41   x42   a4    x44   x45            x51   x52   a5    x54   x55


In the next cell All is used to access the first, second and fourth columns
of matrix (m).

Part[m, All, {1, 2, 4}]//MatrixForm

( x11   x12   x14 )            b1    b2    b4            x31   x32   x34            x41   x42   x44            x51   x52   x54


In the next cell we change elements of (m) where rows (1,3) intersect with
columns (2,3,5).

m[[{1, 3}, {2, 3, 5}]] = {{jjj1, jjj2, jjj3}, {kkk1, kkk2, kkk3}} ;  MatrixForm[m]

( x11    jjj1   jjj2   x14    jjj3 )            b1     b2     b3     b4     b5 ...  x34    kkk3            x41    x42    a4     x44    x45            x51    x52    a5     x54    x55


Created by Mathematica  (May 16, 2004)

Back to Ted’s Tricks index page