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