Re: Trouble modif. Matrix in function
- To: mathgroup at smc.vnet.net
- Subject: [mg29072] Re: [mg29068] Trouble modif. Matrix in function
- From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
- Date: Sun, 27 May 2001 18:04:40 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
First of all, a minor point. Defining a double index list with In[1]:= TavGen[n_]:=Table[Table[1, {i, 1, p}], {p, 1, n}] is rather clumsy. You can get the same thing with In[2]:= TavGen1[n_]:=Table[1,{p,1,n},{i,1,p}] Checking: In[3]:= TavGen1[5]==TavGen[5] Out[3]= True As for your problem, it seems to be is one of the most common problems people used to other programming languages encounter with Mathematica. Your function ElimG ElimG[P_, Rig_, Pos_, Offset_:0] := (P[[Rig, #]] = 0) & /@ Table[i, {i, Pos, Pos + Offset}] when called first evaluates it arguments, and then substitutes them into the body of the function. When that happens P is no longer a symbol but an evaluated matrix, so what you are doing is basically the same as if you tried to evaluate: In[5]:= {{1,2},{3,4}}[[1,1]]=0 Set::setps: {{1,2},{3,4}} in assignment of part is not a symbol. Out[5]= 0 There are several ways to deal with this but the simplest, I think, is to give your function the HoldFirst attribute, which will tell it not to evaluate the first argument. In[6]:= TAB = TavGen[6] Out[6]= {{1},{1,1},{1,1,1},{1,1,1,1},{1,1,1,1,1},{1,1,1,1,1,1}} In[7]:= SetAttributes[ElimG,HoldFirst] In[8]:= ElimG[P_, Rig_, Pos_, Offset_:0] := (P[[Rig, #]] = 0) & /@ Table[i, {i, Pos, Pos + Offset}] In[9]:= ElimG[TAB, 3, 2] Out[9]= {0} In[10]:= TAB Out[10]= {{1},{1,1},{1,0,1},{1,1,1,1},{1,1,1,1,1},{1,1,1,1,1,1}} -- Andrzej Kozlowski Toyama International University JAPAN http://platon.c.u-tokyo.ac.jp/andrzej/ http://sigma.tuins.ac.jp/~andrzej/ on 01.5.27 10:54 AM, Nicola at nicola-mingotti at nospam-libero.it wrote: > Hello , > > I'm new to the comp.soft-sys.math.mathematica > so I hope this question has not been asked many time yet :) > > So : > > Defining > > TavGen[n_] := Table[ > Table[1, {i, 1, p}], {p, 1, n}] > > TAB = TavGen[6] > > Function 1) works , 2) does not work > *********************************************** > 1) Elim[Rig_, Pos_, Offset_:0] := > (TAB[[Rig, #]] = 0) & /@ Table[i, {i, Pos, Pos + Offset}] > ************************************************* > > ************************************************* > 2) ElimG[P_, Rig_, Pos_, Offset_:0] := > (P[[Rig, #]] = 0) & /@ Table[i, {i, Pos, Pos + Offset}] > ************************************************* > > ElimG[TAB, 3, 2] > this gives me : > > Set::"setps": "\!\({\(\({1}\)\), \(\({1, 1}\)\), \(\({1, 0, 1}\)\), \(\({1, > \ > 1, 1, 1}\)\), \(\({1, 1, 1, 1, 1}\)\), \(\({1, 1, 1, 1, 1, 1}\)\)}\) in \ > assignment of part is not a symbol." > > ************************************************** > > I tried using a For instead of a Map but nothing changes :( > > Thanks in advance for your help . > > Please excuse my poor explanations and English . > > Bye. > > > > > > > > >