Re: RE: Expanding a nested structure (pattern matching?)
- To: mathgroup at smc.vnet.net
- Subject: [mg24905] Re: [mg24855] RE: [mg24835] Expanding a nested structure (pattern matching?)
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Sun, 20 Aug 2000 01:34:54 -0400 (EDT)
- References: <8nlh4v$944@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hartmut, David, John
David has sent me Hartmut's fine solution:
ClearAll["`*"]
dsb2[h_List] := Flatten[h]
dsb2[h_ /; MemberQ[h, {___}]] := Distribute[h, List]
dsb2[a_] := a
strexp2[e_] := dsb2//@e (*strexp2 is my notation*)
This is clearly the way to tackle such problems.
We can even reduce the code slightly to
dsb3[a_List] := Flatten[a]
dsb3[a_] := Distribute[a, List]
strexp3[e_] := dsb3//@ e
since, for example, we have
Distribute[3, List]
3
The following version works also through heads
dsb4[a_List] := Flatten[a]
dsb4[r : _List[___]] := Flatten[dsb4 /@ Through[r]]
dsb4[r_] := Distribute[r, List]
strexp4[e_] := dsb4//@e
strexp4[{g, h}[{c, d}, e]]
{g[c, e], g[d, e], h[c, e], h[d, e]}
The three functions agree on the following examples.
examples = {e1 = a[b, c, d[{f, g}, {h, j}]],
e2 = a[b, c, d[e, f[{f1, f2}, {f3, f4}]]],
e3 = a[b, c[{c1, c2}, {c3, c4}], d[e, f[{f1, f2}, {f3, f4}]]],
e4 = f[{a, b}, {{c1, c2}, {d1, d2}}],
e5 = a[b, c, d[e, f[{f1, f2}, {f3, f4, f5}, {f6, f7}]]],
e6 =
a[b, c[{c1, c2}, {c3}], d[e, f[{f1, f2}, {f3, f4, f5}, {f6, f7}]]]};
SameQ @@ Through[{strexp4, strexp3}[#]] & /@ examples
{True, True, True, True, True, True}
A spot timing shows a slight increase is speed
tst = h @@ Table[Random[], {7}, {6}];
Timing[strexp2[tst];]
{10.65 Second, Null}
Timing[strexp3[tst];]
{8.24 Second, Null}
Timing[strexp4[tst];]
{8.08 Second, Null}
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
--
Allan
---------------------
Allan Hayes
Mathematica Training and Consulting
Leicester UK
www.haystack.demon.co.uk
hay at haystack.demon.co.uk
Voice: +44 (0)116 271 4198
Fax: +44 (0)870 164 0565
"David Park" <djmp at earthlink.net> wrote in message
news:8nlh4v$944 at smc.vnet.net...
> [From Hartmut Wolf]
> > Also redefining...
> >
> > dsb2[h_List] := Flatten[h]
> > dsb2[h_ /; MemberQ[h, {___}]] := Distribute[h, List]
> > dsb2[a_] := a
> >
> > dsb2 file://@ e4
> > {f[a, c1], f[a, c2], f[a, d1], f[a, d2], f[b, c1], f[b, c2], f[b, d1],
> > f[b, d2]}
> >
>
> Dear Hartmut,
>
> That seems like a nice solution. And I was blithely unaware of MapAll!
>
> Here is a somewhat more complete list of examples. John communicated with
me
> and gave a case with variable numbers of and lengths of lists.
>
> e1 = a[b, c, d[{f, g}, {h, j}]]
> e2 = a[b, c, d[e, f[{f1, f2}, {f3, f4}]]]
> e3 = a[b, c[{c1, c2}, {c3, c4}], d[e, f[{f1, f2}, {f3, f4}]]]
> e4 = f[{a, b}, {{c1, c2}, {d1, d2}}]
> e5 = a[b, c, d[e, f[{f1, f2}, {f3, f4, f5}, {f6, f7}]]]
> e6 = a[b, c[{c1, c2}, {c3}], d[e, f[{f1, f2}, {f3, f4, f5}, {f6, f7}]]]
>
> On the last case, your method was more than 10 times faster than my
> procedure.
>
> David Park
> djmp at earthlink.net
> http://home.earthlink.net/~djmp/
>
>