Re: Map and functional constructs to replace iterative statements
- To: mathgroup at smc.vnet.net
- Subject: [mg96843] Re: Map and functional constructs to replace iterative statements
- From: Raffy <raffy at mac.com>
- Date: Thu, 26 Feb 2009 07:53:23 -0500 (EST)
- References: <go31ba$f47$1@smc.vnet.net>
Here is a quick tutorial for 3 common commands: /@ (Map), @@@ (Apply), and MapThread f /@ {a, b, c} => { f[a], f[b], f[c] } => Map[f, {a, b, c}, {1}] f @@@ { {a, 1}, {b, 2}, {c, 3} } => { f[a, 1], f[b, 2], f[c, 3] } => Apply[f, {...}, {2}] MapThread[f, { {a, b, c}, {1, 2, 3} }] => { f[a,1], f[b, 2], f[c, 3]} === f @@@ Transpose[ { {a, b, c}, {1, 2, 3} } ] Map is like replacing a value x with f(x). f /@ { a, {1, 2} } => { f [a], f[{1, 2}] } @@@ replaces all the heads at level 2 with f. A matrix, List[List [1,2], List[3,4]] becomes List[ f[1,2], f[3,4] ] Using anonymous functions with Map, @@@, and MapThread MapThread lets you build a list of length n, from other lists of length n, where each element calls f as: f[ element of first list, element of second list .... ] => f[#1, #2, ...] When you these commands with anonymous functions, you can write very concise code. MapThread[ If[#1>#2, #3 > #2, #3 <= 2]&, { {1,2}, {3,4}, {5, 6} } ] Print[#1," = ",#2]& @@@ { {"A", 2}, {"B", 3}, {"D", 4} }; {Length[#], Total[#]} /@ { {}, {1, 3}, {9, 4, 5, 2} }