MathGroup Archive 1998

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

Search the Archive

Re: what is wrong here?



> I am having a lot of difficulty in trying to use commands on a matrix as
> follows:
>
> matrix[[{i,j,k},{i,j,k}]] = matrix[[{i,j,k},{i,j,k}]] + some 3x3 matrix.
>
> See the example below. When   i,j,k areconsecutive indices, there seems
> to   be no problem. When the indices are, say {3,4,7,8},  the program
> always crashes with a  bus error.
>
> In[3]:= temp=Table[b, {i,4},{j,4}]
>
> Out[3]= {{b, b, b, b}, {b, b, b, b}, {b, b, b, b}, {b, b, b, b}}
>
> In[6]:= matrix = Table[a , {i,8},{j,8}]
>
> Out[6]= {{a, a, a, a, a, a, a, a}, {a, a, a, a, a, a, a, a},
>
> >    {a, a, a, a, a, a, a, a}, {a, a, a, a, a, a, a, a},
>
> >    {a, a, a, a, a, a, a, a}, {a, a, a, a, a, a, a, a},
>
> >    {a, a, a, a, a, a, a, a}, {a, a, a, a, a, a, a, a}}
>
> In[7]:= matrix[[{3,4,7,8},{3,4,7,8}]]= \ matrix[[{3,4,7,8},{3,4,7,8}]] +
> temp Bus error

This is caused by an error in listable Part assignments, which affects
some releases of Mathematica Version 3.0.  This error has been
corrected for the next version.

Listable part assignment is a new feature in Version 3.0.  In all
previous versions, this input would have generated a warning message
and would have been rejected.  In Version 2.2, for example, or if you
are using a copy of Version 3.0 where the case that you want to use
doesn't work, it is necessary to separate this assignment  into
individual assignments.  This can be done in a variety of ways, such as

In[1]:= matrix = Table[a , {8},{8}] ;

In[2]:= temp=Table[b, {i,4},{j,4}] ;

In[3]:= Module[{p = {3,4,7,8}, q = {3,4,7,8}},
            Do[matrix[[p[[i]], q[[j]]]] += temp[[i,j]], {i, 4}, {j, 4}]]

In[4]:= MatrixForm[matrix]

Out[4]//MatrixForm=

>   a       a       a       a       a       a       a       a

    a       a       a       a       a       a       a       a

    a       a       a + b   a + b   a       a       a + b   a + b

    a       a       a + b   a + b   a       a       a + b   a + b

    a       a       a       a       a       a       a       a

    a       a       a       a       a       a       a       a

    a       a       a + b   a + b   a       a       a + b   a + b

    a       a       a + b   a + b   a       a       a + b   a + b

or

In[5]:= matrix = Table[a , {8},{8}] ;

In[6]:= MapThread[(matrix[[#1[[1]], #1[[2]]]] += #2) &,
            {Outer[List, {3,4,7,8}, {3,4,7,8}],  temp}, 2]

Out[6]= {{a + b, a + b, a + b, a + b}, {a + b, a + b, a + b, a + b},

>    {a + b, a + b, a + b, a + b}, {a + b, a + b, a + b, a + b}}

which has the same effect on the value of matrix.

If you want this to be done automatically you can add a rule for part
assignment:

In[7]:= Unprotect[Part] ;

In[8]:= Part /: (Part[p_, q__List] = rhs_) :=
            With[{qs = Outer[Hold, q]},
                Print["using Part assignment rule"];
                SetPart[p, qs, rhs] /; Dimensions[qs] ==
Dimensions[rhs]]

In[9]:= SetAttributes[SetPart, {Listable, HoldFirst}]

In[10]:= SetPart[p_, Hold[q__Integer], r_] := (Part[p, q] = r)

In[11]:= matrix = Table[a , {8},{8}] ;

In[12]:= matrix[[{3,4,7,8},{3,4,7,8}]] =
             matrix[[{3,4,7,8},{3,4,7,8}]] + temp using Part assignment
rule

Out[12]= {{a + b, a + b, a + b, a + b}, {a + b, a + b, a + b, a + b},

>    {a + b, a + b, a + b, a + b}, {a + b, a + b, a + b, a + b}}

Dave Withoff
Wolfram Research



  • Prev by Date: Re: Re: ReadList of Mixed Data Types???
  • Next by Date: Re: ListPlot + Colors
  • Prev by thread: Re: Re: ReadList of Mixed Data Types???
  • Next by thread: Re: what is wrong here?