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
>
>
- References:
- Assigning Values to Many Symbols at Once
- From: Gregory Lypny <gregory.lypny@videotron.ca>
- Assigning Values to Many Symbols at Once