Re: Indexed Slot in a Rule - How to do it??
- To: mathgroup at smc.vnet.net
- Subject: [mg100331] Re: [mg100289] Indexed Slot in a Rule - How to do it??
- From: Bob Hanlon <hanlonr at cox.net>
- Date: Mon, 1 Jun 2009 07:08:13 -0400 (EDT)
- Reply-to: hanlonr at cox.net
eqs = {0, 5*x1, 1, 10*x3, 3*x2};
Extract all variable names
xvars = Union[Cases[eqs,
_Symbol?(! NumericQ[#] &),
Infinity]];
Attributes[Function]
{HoldAll,Protected}
Since Function has attribute HoldAll
T = Function[Evaluate[xvars], Evaluate[eqs]];
The argument to T is a Sequence
T[1, 2, 3]
{0,5,1,30,6}
T[Sequence @@ {1, 2, 3}]
{0,5,1,30,6}
Consequently, Apply T to a List
T @@ {1, 2, 3}
{0,5,1,30,6}
Apply[T, {1, 2, 3}]
{0,5,1,30,6}
Bob Hanlon
---- Alan <alan.stone at yahoo.com> wrote:
=============
Here's the problem. Convert a vector (list) with symbol names into
indexed slots. I'm doing this so that I can turn the vector into
function that takes a list. Here's an example of the desired
behavior:
eqs = {0, 5*x1, 1, 10*x3, 3*x2};
convert this to:
indexedeqs = {0, 5*#[[1]], 1, 10*#[[3]], 3*#[[2]]};
T[q_]:=indexedeqs;
T[{1,2,3}] = {0,5,1,30,6}
I can't for the life of me figure out how to do this. I've been
performing meta-Mathematica all week. Here's the closest I've come:
xvars={x1,x2,x3};
MapIndexed[Rule[#1, #[[First@#2]]] &, xvars]
But, this treats the second # literally, and puts in the current item
from xvars. I need a way for the second # to just be # without it
really taking a value.
So, I tried doing it as a string:
xvars={x1,x2,x3};
MapIndexed[Rule[#1, "#[[" <> ToString[First@#2] <> "]]"] &, xvars]
And this creates a rule that looks correct, but, its right hand side
of the rule is a string instead of an expression.
I can't figure this out!!! Any help is greatly appreciated.
All the best,
Alan