Re: Listable Attribute of Pure Function that returns a
- To: mathgroup at smc.vnet.net
- Subject: [mg130745] Re: Listable Attribute of Pure Function that returns a
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Wed, 8 May 2013 04:13:12 -0400 (EDT)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- Delivered-to: l-mathgroup@wolfram.com
- Delivered-to: mathgroup-outx@smc.vnet.net
- Delivered-to: mathgroup-newsendx@smc.vnet.net
- References: <20130506082413.AC36369C3@smc.vnet.net>
On Tue, May 7, 2013 at 11:54 AM, Alex Krasnov <akrasnov at eecs.berkeley.edu>wrote:
>
>
>
> In my understanding, pure functions with anonymous parameters do not
> support attributes.
This is not true in principle, but you are right in that such form is not
documented. You have to use Null for the arguments:
Function[Null, #^2, Listable]
and this form also won't be syntax-highlihted properly by the Front End
(but will work).
> Pure functions with named parameters do as follows:
>
> In: Function[{a, b, c, d}, {{a, b}, {c, d}}, Listable][a, b, c,
> Array[d, 4]]
> Out: {{{a, b}, {c, d[1]}}, {{a, b}, {c, d[2]}}, {{a, b}, {c, d[3]}},
> {{a, b}, {c, d[4]}}}
>
> > If I do the same for a pure function that does not return a list,
> > everything is fine:
> >
> > In[42]:= ClearAll[func2]
> > SetAttributes[func2, Listable]
> > func2 = (#1 + #2)/(#3 - #4) &
> > func2[a, b, c, Array[d, 4]]
> >
> > Out[44]= (#1 + #2)/(#3 - #4) &
> >
> > Out[45]= {(a + b)/(c - d[1]), (a + b)/(c - d[2]), (a + b)/(
> > c - d[3]), (a + b)/(c - d[4])}
> >
> > And in any case, mathematica behaves the same here if I don't do
> > anything with the Attributes of func2, that is, there is no need to
> > explicitly SetAttributes to Listable for this particular example.
>
> In this case, func2 is not Listable, but Plus, Minus, Divide are.
>
In fact, making func2 Listable (for example using the constructs I
suggested above) would only make the function much slower in this
particular case. The reason is that in that case, it would thread over
lists using top-level evaluator, before handing the argument to its body.
While being just (#1 + #2)/(#3 - #4) &, it benefits from numerical
(built-in) listability of functions Plus, Times etc. Since this listability
is realized at a much lower level (kernel), it results in a much faster
execution.
Regards,
Leonid
>
> Alex
>
>
- References:
- Listable Attribute of Pure Function that returns a matrix
- From: Dan O'Brien <danobrie@gmail.com>
- Listable Attribute of Pure Function that returns a matrix