Re: Trace[ Through [ (Max - Min) [ {1, 2, 3, 4, 5} ] ] ]
- To: mathgroup at smc.vnet.net
- Subject: [mg58766] Re: [mg58751] Trace[ Through [ (Max - Min) [ {1, 2, 3, 4, 5} ] ] ]
- From: "David Park" <djmp at earthlink.net>
- Date: Sun, 17 Jul 2005 13:03:12 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hu Zhe,
That is a problem with the Through command. It pushes the arguments onto
everything at the top level and only the top level. It is not a very useful
command as it stands.
At my web site there is a package called Algebra`PushThrough` that allows
better control of how arguments are pushed onto a head expression.
Needs["Algebra`PushThrough`"]
mylist = Table[Random[Integer, {1, 100}], {5}]
{9, 72, 68, 51, 61}
The routine PushThrough does not push onto numbers or Mathematica constants
and there are other elements of control that can be specified.
(Max - Min)[mylist]
% // PushThrough[]
(Max - Min)[{9, 72, 68, 51, 61}]
63
As an alternative, the package routine PushOnto allows the user to specify
the forms that the arguments will be pushed onto.
(Max - Min)[mylist]
% // PushOnto[{Max, Min}]
(Max - Min)[{9, 72, 68, 51, 61}]
63
The package also has the routines: LinearPushOut, PushOut, PushDerivative.
PushOnto is also built into the Tensorial tensor calculus package.
David Park
djmp at earthlink.net
http://home.earthlink.net/~djmp/
From: Zhe Hu [mailto:iamhuzhe at gmail.com]
To: mathgroup at smc.vnet.net
I tried to get the difference between the largest and the smallest
elements in a list.
Max[mylist] - Min[mylist] OR (Max[#]-Min[#])&[mylist] would get the job
done.
However just to be fancy, I tried
Through[Max - Min, mylist] .
It didn't work as expected. Try
Trace[ Through [ (Max - Min) [ {1, 2, 3, 4, 5} ] ] ]
I guess the problem is "Max - Min" was turned into "Max + (-Min)" and
"(-Min)" won't be applied correctly.
One way to go around this problem is to try
Subtract@@Through[{Max, Min}[{1, 2, 3, 4, 5}]]
But that's kind of ugly. Is there better solutions? Thanks.
Sincerely,
Hu Zhe
P.S.
In a language called "J". This is termed "fork". Their expression would be:
(>./ - <./) 1 2 3 4 5