Outer

The first two examples demonstrate the basic use of Outer.

A user asked the MathGroup how to define tables like the one below, but

having larger dimensions without writing the whole table explicitly?

Bob Hanlon provided the following solution.

The next cell does the same thing, and is based on an example in the Help

Browser.

The next cell shows what we get for the outer product of two matrices.

The next cell flattens what we get from the computing Outer with 4 lists.

In the next two examples we provide integers as additional arguments.

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.

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

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.

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[[n,list2]] returns a list of elements at positions (list2) in row n. The

next cell gives an example.

Likewise m[[list1,n]] returns a list of elements at positions (list1) of

column n. The next cell gives an example.

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.

In the next cell All is used to access the first, second and fourth columns

of matrix (m).

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

columns (2,3,5).

PatternTest is closely related to Condition. PatternTest is used to specify that a certain pattern must meet a certain condition. So for example in the next cell (f) is defined when given an argument that is a positive number.

In the next example (f) is only defined when given an argument that is a

positive integer.

In the next example (f) is defined when given an argument that is a positive

integer or a positive real number.

In some cases we want to use a test that isn't a built-in unary operator (Positive, NumericQ, AtomQ, ...). In that case we can use a pure function as in the next example. In the next example (f) is only defined when given an argument that is an integer between 0 and 10.

In the next cell (f) is only defined when given an argument of any type

between 0 and 10. Can you see why we need the part about (Im[#]===0) ?

We can't use pattern variables in the test portion of (Pattn/;Test), and that

is why the definition in the next cell isn't used.

Created by Mathematica (May 16, 2004)