Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2013

[Date Index] [Thread Index] [Author Index]

Search the Archive

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




  • Prev by Date: Re: How Random works?
  • Next by Date: Re: How Random works?
  • Previous by thread: Re: Listable Attribute of Pure Function that returns a
  • Next by thread: Re: Listable Attribute of Pure Function that returns a matrix