Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

Description:

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

For the function Thread:

ThreadUsage1:

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

ThreadUsage2:

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

ThreadUsage3:

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 are shown below:

InnerUsage:

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

OuterUsage:

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

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.

share|improve this question
2  
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 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.:-) –  ShutaoTang Aug 20 at 10:23

6 Answers 6

up vote 7 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.

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

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

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: carmullion's video

share|improve this answer
    
@kguler...I am learning so much this week...nice –  ubpdqn Aug 20 at 12:52
    
thank you @ubpdqn... me too :) –  kguler Aug 20 at 13:08

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 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 at 13:52
(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 at 12:04

My understanding about the execution process of MapThread

I find it is easy to understand MapThread by using the inneral built-in function Transpose

MapThread[f, {{a, b, c}, {x, y, z}, {u, v, w}}]

Apply[f, Transpose[{{a, b, c}, {x, y, z}, {u, v, w}}], {1}]

{f[a, x, u], f[b, y, v], f[c, z, w]}

The comprehension of Inner

Learning from Leonid Shifrin's Mathematica programming: an advanced introduction

Thanks for @m_goldberg's suggesstion

Inner[f,list1,list2,g] == Apply[g,MapThread[f,{list1,list2}]]

Example 1:

Apply[g,MapThread[f,{{a,b,c},{x,y,z}}]]
(*==>g[f[a, x], f[b, y], f[c, z]]*)

Or

Inner[f,list1,list2,g] == Apply[g,f@@@Transpose[{list1,list2}]]

Example2:

 Apply[g, f @@@ Transpose[{{a, b, c}, {x, y, z}}]]
 (*==>g[f[a, x], f[b, y], f[c, z]]*)
share|improve this answer

Your Answer

 
discard

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.