43
$\begingroup$

Description:

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

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.

$\endgroup$
3
  • 3
    $\begingroup$ 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. $\endgroup$
    – m_goldberg
    Commented Aug 20, 2014 at 10:12
  • $\begingroup$ 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. $\endgroup$
    – Szabolcs
    Commented Nov 9, 2016 at 7:43
  • $\begingroup$ @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. $\endgroup$
    – xyz
    Commented Nov 9, 2016 at 7:59

5 Answers 5

30
$\begingroup$

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.

listL={{a11,a12},{a21,a22},{a31,a32},{a41,a42}};
listR={{b11,b12,b13},{b21,b22,b23}};
Inner[times,listL,listR,plus]
$\endgroup$
46
+500
$\begingroup$

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

Thread

enter image description here

Inner:

enter image description here

Outer

enter image description here

See also: cormullion's video

$\endgroup$
5
  • $\begingroup$ @kguler...I am learning so much this week...nice $\endgroup$
    – ubpdqn
    Commented Aug 20, 2014 at 12:52
  • $\begingroup$ Loved them when they first came out; still love them today. $\endgroup$ Commented May 4, 2015 at 10:02
  • $\begingroup$ @J. M., same here -- especially the sound effects:) $\endgroup$
    – kglr
    Commented May 4, 2015 at 10:10
  • $\begingroup$ @Guesswhoitis., I know you are J.M :) Welcome back! $\endgroup$
    – xyz
    Commented May 5, 2015 at 5:24
  • $\begingroup$ @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 $\endgroup$
    – Mr.Wizard
    Commented Jul 26, 2016 at 18:21
26
$\begingroup$

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]
$\endgroup$
11
$\begingroup$
(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

$\endgroup$
2
  • $\begingroup$ like you answer+1 $\endgroup$
    – ubpdqn
    Commented Aug 20, 2014 at 12:04
  • $\begingroup$ +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. $\endgroup$
    – Trad Dog
    Commented Apr 8, 2016 at 8:34
9
$\begingroup$

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]
$\endgroup$
2
  • $\begingroup$ Might I suggest f@@{a,x} etc.? $\endgroup$ Commented Aug 20, 2014 at 13:49
  • 1
    $\begingroup$ 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. $\endgroup$
    – Michael E2
    Commented Aug 20, 2014 at 13:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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