Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top


In Mathematica the functions like Thread, Inner, Outer etc. are very important and are used frequently.

For the function Thread:

Thread Usage1:

Thread[f[{a, b, c}]]
{f[a], f[b], f[c]}

Thread Usage2:

Thread[f[{a, b, c}, x]]
{f[a, x], f[b, x], f[c, x]}

Thread Usage3:

Thread[f[{a, b, c}, {x, y, z}]]
{f[a, x], f[b, y], f[c, z]}

And I understand the Usage1, Usage2, Usage3 easily as well as I use them masterly.

However I always cannot master the usage of Inner and Outer so that I must refer to the Mathematica Documentation every time when I feel I need using them.

I find that I cannot master them owing to that I cannot understand the results of Inner and Outer clearly. Namely, I always forget what construct they generate when executed.

The typical usage cases of Inner and Outer shown as below:

Inner Usage:

Inner[f, {a, b}, {x, y}, g]
g[f[a, x], f[b, y]]
Inner[f, {{a, b}, {c, d}}, {x, y}, g]
{g[f[a, x], f[b, y]], g[f[c, x], f[d, y]]}
Inner[f, {{a, b}, {c, d}}, {{x, y}, {u, v}}, g]
{{g[f[a, x], f[b, u]], g[f[a, y], f[b, v]]}, 
 {g[f[c, x], f[d, u]], g[f[c, y], f[d, v]]}}

Outer Usage:

Outer[f, {a, b}, {x, y, z}]
{{f[a, x], f[a, y], f[a, z]}, {f[b, x], f[b, y], f[b, z]}}
Outer[f, {{1, 2}, {3, 4}}, {{a, b}, {c, d}}]
{{{{f[1, a], f[1, b]}, {f[1, c], f[1, d]}}, 
  {{f[2, a], f[2, b]}, {f[2, c], f[2, d]}}}, 
 {{{f[3, a], f[3, b]}, {f[3, c], f[3, d]}}, 
  {{f[4, a], f[4, b]}, {f[4, c], f[4, d]}}}}


  1. How to master the usage Inner and Outer? Namely, how can I use them without referring to the Mathematica Documentation?

  2. How to understand the result of Out[3],Out[4],Out[5] figuratively? Namely, by using graphics or other way.

share|improve this question
I recommend that you download and work through Leonid Shifrin's Mathematica programming: an advanced introduction. It's free and answers a lot of question you ask. – m_goldberg Aug 20 '14 at 10:12
@m_goldberg,I read the 1-3 chapters of that book three months ago,but owing to some other things, I don't read the latter chapters.Thanks for your suggestion sincerely.I will continue to read it right now.:-) – Shutao TANG Aug 20 '14 at 10:23
up vote 21 down vote accepted

I think of Outer just like nikie showed.

Inner is a generalization of matrix multiplication. I like the picture from the Wikipedia page.

Matrix Multiplication

To calculate an entry of matrix multiplication, you first pair list entries (a11,b12) and (a12,b22). You "times/multiply" those pairs (a11*b12) and (a12*b22), and then you "plus/add" all the results (a11*b12)+(a12*b22). Note that you "times" before you "plus" in matrix multiplication which helps me remember the order of arguments for Inner.

share|improve this answer

Animated Mathematica Functions contains cool animated illustrations of the way a number of built-in functions work. Among them are


enter image description here


enter image description here


enter image description here

See also: cormullion's video

share|improve this answer
@kguler...I am learning so much this week...nice – ubpdqn Aug 20 '14 at 12:52
thank you @ubpdqn... me too :) – kglr Aug 20 '14 at 13:08
Loved them when they first came out; still love them today. – J. M. May 4 '15 at 10:02
@Guesswhoitis., same here -- especially the sound effects:) – kglr May 4 '15 at 10:10
@Guesswhoitis., I know you are J.M :) Welcome back! – Shutao TANG May 5 '15 at 5:24

Not sure if that's what you're looking for: This is the image I always have in mind for Outer[f,{a,b,c},{x,y,z}]:

enter image description here

args = {{a, b, c}, {x, y, z}};
TableForm[Outer[f, args[[1]], args[[2]]], TableHeadings -> args]
share|improve this answer
(i = Inner[List, Range@3, Range@3, List]) // MatrixForm;

enter image description here

(o = Outer[List, Range@3, Range@3]) // MatrixForm

enter image description here

p1 = ListLinePlot[i, Mesh -> All, PlotStyle -> Red, PlotTheme -> "Detailed"];
p2 = ListLinePlot[o, Mesh -> All, PlotStyle -> Blue, PlotTheme -> "Detailed"];

Legended[Show[p2, p1, PlotRange -> All], LineLegend[{Red, Blue}, {"Inner", "Outer"}]]

enter image description here

share|improve this answer
like you answer+1 – ubpdqn Aug 20 '14 at 12:04
+1 for the compactness. It might have been even more immediate (specially in the first example) with: (i = Inner[List, {a, b, c}, Range@3, List]) // MatrixForm. – Trad Dog Apr 8 at 8:34

I think of Outer like nikie's answer shows. Here's a similar view of Inner. Think of the arguments in columns. Apply f to each row and g to the result.

Mathematica graphics

args = {{a, b, c}, {x, y, z}};
Format[g[e__]] := Column[{g, e},
   Dividers -> {None, {False, True, False}}, Alignment -> Center];
Inner[f, Sequence @@ args, g]
share|improve this answer
Might I suggest f@@{a,x} etc.? – Timothy Wofford Aug 20 '14 at 13:49
Thanks. I wanted a divider, but I hate dealing with tables/grids in Mma. I'd thought about f[a, x], too (i.e., no Format-ting). I was trying to emphasize the columns. – Michael E2 Aug 20 '14 at 13:52

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.