# How to understand the usage of Inner and Outer figuratively?

## Description:

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

For the function Thread:

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

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


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

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


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]}}}}


## Questions:

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.

• 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. Aug 20 '14 at 10:12
• I don't know why you are leaving. All I can say is that I hope you are not taking SE too seriously. It's just a website, a tool to get help and learn from. When you find yourself spending too much time on it, it's good to take a break. I do that from time to time. But don't let it affect you emotionally. Nov 9 '16 at 7:43
• @Szabolcs In fact, I made a mistake and Moderator R.M pointed it out some time ago. And I did affected by M.SE emotionly but I don't know why.
– xyz
Nov 9 '16 at 7:59

I think of Outer just like nikie showed.

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

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.

listL={{a11,a12},{a21,a22},{a31,a32},{a41,a42}};
listR={{b11,b12,b13},{b21,b22,b23}};
Inner[times,listL,listR,plus]


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

Outer

• @kguler...I am learning so much this week...nice Aug 20 '14 at 12:52
• Loved them when they first came out; still love them today. May 4 '15 at 10:02
• @J. M., same here -- especially the sound effects:)
– kglr
May 4 '15 at 10:10
• @Guesswhoitis., I know you are J.M :) Welcome back!
– xyz
May 5 '15 at 5:24
• @Leandro I am not sure why you are addressing me here. This is kglr's answer, not mine; I only edited it. Also the answer starts with a link to a collection of these animations: reference.wolfram.com/legacy/flash Jul 26 '16 at 18:21

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}]:

args = {{a, b, c}, {x, y, z}};
TableForm[Outer[f, args[[1]], args[[2]]], TableHeadings -> args]

(i = Inner[List, Range@3, Range@3, List]) // MatrixForm;


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


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"}]]


• like you answer+1 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. Apr 8 '16 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.

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]

• Might I suggest f@@{a,x} etc.? 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. Aug 20 '14 at 13:52