MathGroup Archive 2005

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

Search the Archive

Re: Re: Re: Re: Re: Can't assign value to symbols

  • To: mathgroup at smc.vnet.net
  • Subject: [mg58534] Re: Re: [mg58513] Re: [mg58458] Re: [mg58444] Re: [mg58409] Can't assign value to symbols
  • From: Bruce Colletti <vze269bv at verizon.net>
  • Date: Wed, 6 Jul 2005 03:11:18 -0400 (EDT)
  • Sender: owner-wri-mathgroup at wolfram.com

Andrzej

Yes, your idea does work!  Thanks.

I've moved your Scan to the inside-end of the loop, since it kills two birds with one stone.  The code below works as intended unless a,b,c have values (and then error messages abound).  

The only way I know to avoid this problem is to make Scan[Clear,Names["Global`*"]] the new first line...except that this (unfortunately) zaps ALL variables.

There must be a better way (than my above idea) to clear the T[[1]]-variables (that may have values coming into the code below).  

How would you tell Mathematica to hold unevaluated the T[[1]]-elements so that they can be used to clear the associated variables?

Bruce

T={{a,b,c},{3,4,2},{12,2,1},{6,5,-3}};
X=Map[SymbolName,T[[1]]];

Do[Print@MapThread[Set,{ToExpression[X,StandardForm,Unevaluated],T[[k]]}];
    Scan[Clear,X],
    {k,2,Length@T}];


=====================
From: Andrzej Kozlowski <akozlowski at gmail.com>
To: mathgroup at smc.vnet.net
n
Subject: [mg58534] Re: [mg58513] Re: [mg58458] Re: [mg58444] Re: [mg58409] Can't assign value to symbols

I see. In this case, does not

Scan[Clear,X]

after the Do loop do what you want?

Andrzej

On 5 Jul 2005, at 17:31, Bruce Colletti wrote:

> Andrzej
>
> The aim is to explictly avoid (throughout the code) referring to  
> the variables.
>
> For instance, suppose matrix T (in my code) springs from an Excel  
> spreadsheet imported into Mathematica, one whose top row declares  
> the variable names, and whose later rows give the variables' values  
> for each iteration in a simulation.  Suppose further that the  
> number of columns may change.
>
> Bruce
>
>
> Bruce
>
> =====================
> From: Andrzej Kozlowski <akozlowski at gmail.com>
To: mathgroup at smc.vnet.net
> Date: Tue Jul 05 00:57:52 CDT 2005
> Subject: [mg58534] [mg58513] Re: [mg58458] Re: [mg58444] Re: [mg58409] Can't  
> assign value to symbols
>
> To tell the truth, I don't understand what you are trying to do. Why
> do you want to reevaluate the line X=... ?
>
> If you do not want at the end of your Do loop the variables a,b,c to
> have assigned values the simplest way is to use Block:
>
> Block[{a, b, c}, Do[
>      Print@MapThread[Set, {ToExpression[X,
>           StandardForm, Unevaluated], T[[k]]}],
>      {k, 2, Length@T}]];
>
> All the assignments will now take place locally inside Block and the
> variables {a,b,c} are automatically cleared on exit-ting Block.
>
> Andrzej Kozlowski
>
>
> On 5 Jul 2005, at 00:18, Bruce Colletti wrote:
>
>
>> Andrzej
>>
>> Using your reply, I offer this code for Lee's consideration.
>>
>> Although it works when first run, if re-run without quitting the
>> kernal, the "X= line" causes an error because a,b,c are instantiated.
>>
>> At the start of the program, how can I clear these variables
>> WITHOUT explicitly declaring them?  I've failed to find the right
>> argument for Clear (e.g., Clear at Subscript...can't find the right
>> counterpart for Subscript).
>>
>> Thankx.
>>
>> Bruce
>>
>>
>> T={{a,b,c},{3,4,2},{12,2,1},{6,5,-3}};
>>
>> X=Map[SymbolName,T[[1]]];
>>
>> Do[Apply[Clear,ToExpression[X,StandardForm,Unevaluated]];
>>     Print@MapThread[Set,{ToExpression[X,StandardForm,Unevaluated],T
>> [[k]]}],
>>     {k,2,Length@T}];
>>
>> =====================
>> From: Andrzej Kozlowski <akozlowski at gmail.com>
To: mathgroup at smc.vnet.net
>>
>> Date: Sun Jul 03 02:57:11 CDT 2005
>> Subject: [mg58534] [mg58513] [mg58458] Re: [mg58444] Re: [mg58409] Can't  
>> assign value
>> to symbols
>>
>> Instead of ToExpression use
>>
>> ToExpression[#, StandardForm, Unevaluated] &
>>
>> For example:
>>
>>
>> In[1]:=
>> parameters = {{"a", "b", "c"}, {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
>>
>> In[2]:=
>> MapThread[(#1 = #2) & , {ToExpression[#,StandardForm,Unevaluated]& /@
>> parameters[[1]],
>> parameters[[3]]}] ;
>>
>> In[3]:=
>> a
>>
>> Out[3]=
>> 4
>>
>> In[4]:=
>> MapThread[(#1 = #2) & , {ToExpression[#,StandardForm,Unevaluated]& /@
>> parameters[[1]],
>> parameters[[2]]}] ;
>>
>> In[5]:=
>> a
>>
>> Out[5]=
>> 1
>>
>>
>> Of course instead of Standardform you can use TraditionalForm or even
>> InputForm.
>>
>> Andrzej Kozlowski
>>
>> Chiba, Japan
>>
>>
>> On 2 Jul 2005, at 17:07, Lee Newman wrote:
>>
>>
>>
>>> Thanks for the solutions.  I'm running with David Park's solution,
>>> but
>>> now realize there is one additional problem.  Once I've executed the
>>> statement  MapThread[(#1 = #2) & , {parameters[[1]], parameters
>>> [[3]]}] ,
>>> because I've specified the first row of "parameters" as symbols,  
>>> this
>>> row now loses the symbol names and takes on the assigned values,  
>>> such
>>> that my attempt to execute the MapThread Statement again for a
>>> different
>>> set of values, e.g. parameters[[2]], fails.
>>>
>>> in: MapThread[(#1 = #2) & , {parameters[[1]], parameters[[3]]}] ;
>>> in: {a,b,c}
>>> Out: {4,5,6}
>>> in: MapThread[(#1 = #2) & , {parameters[[1]], parameters[[2]]}] ;
>>> out:  Set:: setraw : Cannot assign to raw object 4 ...  etc
>>>
>>> I want to preserve the first row of "parameters" as the symbol
>>> names, so
>>> one solution is to use strings, and modify David Park's solution to
>>> turn
>>> the strings into symbol names when assigned, This works the first
>>> time
>>> it is run, and parameters[[1]] still contains the strings, but ut
>>> still
>>> fails the second time.  but why?
>>> in:  parameters = {{"a", "b", "c"}, {1, 2, 3}, {4, 5, 6}, {7, 8,  
>>> 9}};
>>> in:  MapThread[(#1 = #2) & , {ToExpression /@ parameters[[1]],
>>> parameters[[3]]}] ;
>>> in:  {a,b,c}
>>> out {4,5,6}
>>> in:  MapThread[(#1 = #2) & , {ToExpression /@ parameters[[1]],
>>> parameters[[3]]}] ;
>>> out:   Set:: setraw : Cannot assign to raw object 4 ...  etc
>>>
>>> why does the MapThread statement fail the second time?  It seems
>>> ToExpression/@parameters[[1]] converts the strings "a", "b", "c" to
>>> symbols but then evaluates them prior to returning them, so the
>>> attempt
>>> to assign to them in MapThread fails.
>>>
>>> How can I modify the MapThread statement so I can call it multiple
>>> times, each time assigning values to the symbols identified by the
>>> strings in the first row??
>>>
>>> Lee
>>>
>>>
>>>
>>> David Park wrote:
>>>
>>>
>>>
>>>> Lee,
>>>>
>>>> Set (=) has a higher precedence Than Function (&). So all you have
>>>> to do is
>>>> add parentheses.
>>>>
>>>> parameters = {{a, b, c}, {1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
>>>>
>>>> MapThread[(#1 = #2) & , {parameters[[1]], parameters[[3]]}]
>>>> {4, 5, 6}
>>>>
>>>> David Park
>>>> djmp at earthlink.net
>>>> http://home.earthlink.net/~djmp/
>>>>
>>>> From: Lee Newman [mailto:leenewm at umich.edu]
To: mathgroup at smc.vnet.net
>>>>
> To: mathgroup at smc.vnet.net
>
>>>>
>>>>
>>>>
>>>> Hello,
>>>>
>>>> Situation:  I have a table that contains parameters and sets of
>>>> values
>>>> that I want to assign to the parameters for the purposes of
>>>> running a
>>>> simulation.
>>>> - parameters = {{a,b,c},{1,2,3},{4,5,6},{7,8,9}}
>>>> - want to assign values in a given row to the symbols listed in the
>>>> first row.
>>>> - tried using:  MapThread[  #1 = #2 &, {parameters[[1]], parameters
>>>> [[3]]} ]
>>>> - fails with error  "Tag Slot in #1 is Protected"
>>>> - tried adding Unprotect[#1] and a variety of other attemps, but
>>>> can't
>>>> get it to work.
>>>>
>>>> Anyone know how might accomplish this?
>>>>
>>>> Thanks,
>>>> Lee
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>
>>
>>
>
>


  • Prev by Date: Re: Re: Re: how to find n in expression x^n using a pattern?
  • Next by Date: Re: Re: Re: Re: Can't assign value to symbols
  • Previous by thread: Re: Re: Re: Re: Can't assign value to symbols
  • Next by thread: Re: Re: Re: Re: Can't assign value to symbols