MathGroup Archive 2013

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

Search the Archive

Listable Attribute of Pure Function that returns a matrix

As I understand it, a function which has its attribute set to Listable 
should thread over any arguments presented as lists.

In[25]:= ClearAll[func]
SetAttributes[func, Listable]
func[a, b, c, Array[d, 4]]

Out[27]= {func[a, b, c, d[1]], func[a, b, c, d[2]],
  func[a, b, c, d[3]], func[a, b, c, d[4]]}

Ok, this is fine.  Now, if I take the symbol 'f' and define a function 
that returns a matrix

In[35]:= func[a_, b_, c_, d_] := {{a, b}, {c, d}}
func[a, b, c, Array[d, 4]]

Out[36]= {{{a, b}, {c, d[1]}}, {{a, b}, {c, d[2]}}, {{a, b}, {c,
    d[3]}}, {{a, b}, {c, d[4]}}}

Still doing fine, this threaded over my array of d's and returned a list 
of arrays as expected. It appears that mathematica constructs the list 
of Out[27] and then evaluates.

Now, I do the same but instead I define a pure function
In[37]:= ClearAll[func]
SetAttributes[func, Listable]
func = {{#1, #2}, {#3, #4}} &;
func[a, b, c, Array[d, 4]]

Out[40]= {{a, b}, {c, {d[1], d[2], d[3], d[4]}}}

Clearly this is not behaving as a listable function, its simply 
substituting the list of d's for the 4th argument.

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.

I don't pretend to know all the ins and outs of Attributes, but is my 
result for the pure function 'func' in Out[40] expected?

  • Prev by Date: Re: Minimize Headscratcher
  • Next by Date: Re: Preventing a plot used as background from updating
  • Previous by thread: Re: space between frame and plot on contourplot
  • Next by thread: Re: Listable Attribute of Pure Function that returns a