Re: Indexed Slot in a Rule - How to do it??
- To: mathgroup at smc.vnet.net
- Subject: [mg100323] Re: Indexed Slot in a Rule - How to do it??
- From: Szabolcs <szhorvat at gmail.com>
- Date: Mon, 1 Jun 2009 07:06:44 -0400 (EDT)
- References: <gvtme0$gct$1@smc.vnet.net>
On May 31, 1:33 pm, Alan <alan.st... 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. > It is certainly possible to do this, and I'm sure several people will post a solution. So here's an alternative suggestion: Instead of #[[1]], etc. use #1, #2, ... and then Apply the function with @@ (or apply it at level one with @@@ instead of mapping with /@, etc.) In[1]:= eqs = {0, 5*x1, 1, 10*x3, 3*x2}; In[2]:= f = With[{fun = eqs /. {x1 -> #1, x2 -> #2, x3 -> #3}}, fun &] Out[2]= {0, 5 #1, 1, 10 #3, 3 #2} & In[3]:= f @@ {x, y, z} Out[3]= {0, 5 x, 1, 10 z, 3 y}