Re: Question about thread
- To: mathgroup at smc.vnet.net
- Subject: [mg2643] Re: [mg2581] Question about thread
- From: Allan Hayes <hay at haystack.demon.co.uk>
- Date: Thu, 30 Nov 1995 21:02:50 -0500
sherod at boussinesq.Colorado.EDU (Scott Herod)
in [mg2581] Question about thread
writes
"I have a question about the way Thread behaves. From the
description in the _Mathematica_ book, I would expect it to return
lists. For example " (attached)
Scott,
1.Thread is not restricted to Lists
Thread[f[h[1,2],h[3,4]], h ] (*use 2nd place*)
h[f[1, 3], f[2, 4]]
2.We have some control where the threading takes place
Thread[f[x,g[y,z],h[a1,b1],h[a2,b2]],h,3] (*use 2nd & 3rd places*)
h[f[x, g[y, z], a1, h[a2, b2]], f[x, g[y, z], b1, h[a2, b2]]]
3.The behaviour of your example:
blat[p_, q_] := Module[{}, Plus @@ (Variables[p]^q)]
Thread[blat[{a+c,b+d},x]]
x x x x
a + b + c + d
is due to blat being evaluated before Thread acts.
Here are some ways that this can be prevented.
Thread[Unevaluated[blat[{a+c,b+d},x]]]
x x x x
{a + c , b + d }
ReleaseHold[Thread[Hold[blat][{a+c,b+d},x]]]
x x x x
{a + c , b + d }
Block[{blat},Thread[blat[{a+c,b+d},x]]]
x x x x
{a + c , b + d }
Where it is suitable the first way is usually quickest. The last
one depends on Literal[blat] being a symbol]
Allan Hayes
hay at haystack.demon.co.uk
********
Begin forwarded message:
>From: sherod at boussinesq.Colorado.EDU (Scott Herod)
>Subject: [mg2581] Question about thread
I have a question about the way Thread behaves. From the description
in the _Mathematica_ book, I would expect it to return lists. For
example
Mathematica 2.2 for Solaris
Copyright 1988-93 Wolfram Research, Inc.
License valid through 28 Nov 1995.
-- Open Look graphics initialized --
In[1]:= Thread[f[{a,b},x]]
Out[1]= {f[a, x], f[b, x]}
But that doesn't always seem to be the case.
In[2]:= blat[p_, q_] := Module[{}, Plus @@ (Variables[p]^q)]
In[3]:= blat[a+b,x]
x x
Out[3]= a + b
In[4]:= Thread[blat[{a+c,b+d},x]]
x x x x
Out[4]= a + b + c + d
Why isn't Out[4] the same as
In[5]:= Outer[blat, {a+c, b+d} , {x}] // Flatten
x x x x
Out[5]= {a + c , b + d }
Scott Herod
Applied Mathematics
University of Colorado, Boulder
sherod at colorado.edu