MathGroup Archive 2009

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

Search the Archive

Re: Assigning Values to Many Symbols at Once

  • To: mathgroup at smc.vnet.net
  • Subject: [mg101773] Re: [mg101699] Assigning Values to Many Symbols at Once
  • From: Gregory Lypny <gregory.lypny at videotron.ca>
  • Date: Thu, 16 Jul 2009 08:22:08 -0400 (EDT)
  • References: <200907141200.IAA05959@smc.vnet.net>

Thank you, Ssezi, Zach, and Leonid, for your thoughtful responses.

Ssezi's solution works both in assigning string and numerical values  
subject to the qualifier, noted by everyone, that you can only do it  
once.

	MapThread[(#=#2)&,{Table[Symbol["x" <> ToString[i]], {i,  
5}],Table["value" <> ToString[i],{i,5}]}]

Leonid and Zach, both of you suggested direct list-to-list  
assignments, which is what I thought should work but does not with you  
create the list of new symbols using Table or mapping.  It does work  
if you create the symbol list manually,  For example, typing

	{x1, x2} = {9, 11}

works as expected, creating two new symbols, x1 with a value of 9 and  
x2 with a value of 10.  However,

	Table[Symbol["x" <> ToString[i]], {i, 5}] = {1,2,3,4,5}

and

	Table[Symbol["x"<>ToString[i]],{i,5}]=Table[i,{i,5}]

result in the error message

	Set::write: Tag Table in Table[Symbol[xabc<>ToString[i]],{i,5}] is  
Protected.

I still haven't worked through Leonid's workaround.

	Thanks again,

			Gregory

Ssezi wrote:

> One option is something like:
>
> MapThread[(#=#2)&,{Table[Symbol["x" <> ToString[i]], {i,  
> 5}],Table["value" <> ToString[i],{i,5}]}]
>
> but you can't do this twice since the once the symbols are  
> associated with values the evaluator with evaluate the symbol then  
> attempt to assign the value resulting in assignment to a raw object.
>
> Regards,
>
> Ssezi


Zach wrote:

> Hi Gregory,
>
> You can simply do list-to-list assignments:
> {x1,x2,x3,x4,x5}={value1,value2,value3,value4,value5}
>
> in whatever way you want, e.g.
> Table[Symbol["x"<>ToString[i]],{i,5}]=Table[i,{i,5}]
>
> Note that this is especially useful for doing parallel calculations  
> to obtain values not derived from loops. E.g.
> {x1,x2}={ParallelEvaluate[(*some long calculation*),{Kernels[] 
> [[1]]}],ParallelEvaluate[(*some different long calculation*), 
> {Kernels[][[2]]}]}
>
> Cheers,
> Zach


Leonid Shifrin wrote:

> Hi Gregory,
>
> If your symbols don't have values, you can simply use Set:
>
>  Table[Symbol["x" <> ToString[i]], {i, 5}] = {1,2,3,4,5}
>
> for instance. If they do have values, this is a bit more work. The  
> following
> will do what you presumably want, in both cases:
>
> In[1] =
>
> ClearAll[assignToSymbols];
> SetAttributes[assignToSymbols, HoldFirst];
> assignToSymbols[base_String, {startIndex_Integer, endIndex_Integer},
>     values_List] /; endIndex - startIndex + 1 == Length[values] :=
>   assignToSymbols @@
>    Append[Unevaluated /@ Thread[
>       Table[
>        ToExpression[base <> ToString[i], InputForm, Hold],
>        {i, startIndex, endIndex}], Hold], values];
>
> assignToSymbols[symbs : {___Symbol}, values_List] /;
>    Length[Hold @@ symbs] == Length[values] :=
>   Unevaluated[symbs] = values;
>
>
> In[2]=
> Clear[x1, x2, x3, x4, x5];
> assignToSymbols["x", {1, 5}, Range[5]];
> {x1, x2, x3, x4, x5}
>
>
> Out[2] = {1, 2, 3, 4, 5}
>
>
> In[3] = assignToSymbols["x", {1, 5}, Range[5, 9]]
>
>
> Out[3] = {5, 6, 7, 8, 9}
>
>
> Regards,
> Leonid
>
>
>
> On Tue, Jul 14, 2009 at 5:00 AM, Gregory Lypny <gregory.lypny at videotron.ca 
> > wrote:
> Hello everyone,
>
> I can create a bunch of symbols on the fly using the Symbol command,
> as in
>
>        Table[Symbol["x" <> ToString[i]], {i, 5}]
>
> to get
>
>        {x1,x2,x3,x4,x5}
>
> But how can I assign values to these all at once?
>
> Regards,
>
>        Gregory
>
>


  • Prev by Date: Re: ParallelTable doesn't work, but Table does
  • Next by Date: Re: Determine if a parameter is a function
  • Previous by thread: Re: Assigning Values to Many Symbols at Once
  • Next by thread: Re: Assigning Values to Many Symbols at Once