Re: MapThread over ragged arrays

*To*: mathgroup at smc.vnet.net*Subject*: [mg83419] Re: MapThread over ragged arrays*From*: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>*Date*: Tue, 20 Nov 2007 03:46:47 -0500 (EST)*Organization*: The Open University, Milton Keynes, UK*References*: <fhrrbf$583$1@smc.vnet.net>

Ravi Balasubramanian wrote: > I have two matrices that are ragged. Note that matrices, as defined in linear algebra, are never ragged: they always have a regular shape (rectangular or square). An array can be ragged, however. > mat1 = {{1, 2}, {2, 3, 4}, {5, 6}} > mat2 = {{a, b}, {b, c, d}, {e, f}} > > I have to Map a function f at level 2. So that I have > > { > {f[1,a],f[2,b]}, > {f[2,b], f[3,c], f[4,d]}, > {f[5,e],f[6,f]}, > } > > MapThread seems to thread only over full arrays, and so I cannot thread (* Rant *) Buried in the abysses of the help page for MapThread under the title "Possible Issues" within the "Examples" section, the adventurous mind can read, "All arguments must be lists of the same length." Usually, possible issues refer to some specific or exceptional cases, whereas, in this case, the restriction is by design: it is mandatory to pass lists of equal length. Sometimes I really wonder who wrote the documentation of version 6 :-)] (* End Rant *) > over level {2}. I know I can I do this using two MapThreads (each at > level 1), but that seems unnecessary. Thread seems to apply the head to > each value, and if the head does not match, the value is repeated (which > might not be necessary). Seems like a simple thing to do. Any ideas? The following should do what you are looking for. The function pad, a helper function, reshapes a ragged array into a rectangular structure, padding the extra elements with Sequence. We call MapThread with the padded arrays and the successive application of the transformation rules Sequence -> Sequence[] and f[] -> Sequence[] reconstructs an array with a shape identical to the original ragged arrays. In[1]:= pad[lst_List] := PadRight[#, Length@lst, Sequence] & /@ lst rag1 = {{1, 2}, {2, 3, 4}, {5, 6}}; rag2 = {{a, b}, {b, c, d}, {e, f}}; MapThread[f, pad /@ {rag1, rag2}, 2] /. Sequence -> Sequence[] /. f[] -> Sequence[] Out[4]= {{f[1, a], f[2, b]}, {f[2, b], f[3, c], f[4, d]}, {f[5, e], f[6, f]}} Regards, -- Jean-Marc