MathGroup Archive 2010

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

Search the Archive

Re: Stop mathematica reordering expression during matrix

  • To: mathgroup at smc.vnet.net
  • Subject: [mg109409] Re: Stop mathematica reordering expression during matrix
  • From: Leonid Shifrin <lshifr at gmail.com>
  • Date: Sun, 25 Apr 2010 06:26:30 -0400 (EDT)

Hi Robert,

One way to do what you want would be to disable the Orderless attribute of
Times temporarily during the evaluation of your code:

In[54]:=
Unprotect[Times];
ClearAttributes[Times,Orderless];
C2=C1.C1;
result = Hold[Evaluate[C2]];
SetAttributes[Times,Orderless];
Protect[Times];


In[60]:= result

Out[60]= Hold[{{x1 x2,0,x1 x3,0},{x3 x4,x2 x1,0,x3 x5},{x5 x6,x4 x1,x5
x7,0},{x7 x4,x6 x1,0,x7 x5}}]

However, as soon as you switch the Orderless attribute on, your
answer will take the ordered form as soon as you allow it to evaluate, so
you have to wrap it in something like Hold to prevent this from happening -
this is what I've done.

To use this result, you have a couple of choices. You can disable Orderless
attribute for Times for the entire computation that you want to carry out.
Alternatively, you can  carefully construct your functions to work with held
(unevaluated) results like the one we got. One more option would be to do
whatever you want with this result while blocking Times:

Block[{Times},
do-something-with-result].

Finally, you can replace Times by some other head, say <times>, replacing it
back to Times at the end (when you are ready to do that):

In[61]:= (result/.Times->times)//ReleaseHold//MatrixForm

Out[61]//MatrixForm= (times[x1,x2]    0    times[x1,x3]    0
times[x3,x4]    times[x2,x1]    0    times[x3,x5]
times[x5,x6]    times[x4,x1]    times[x5,x7]    0
times[x7,x4]    times[x6,x1]    0    times[x7,x5]

)

Which of these options is better depends on the situation, particularly on
what you want to do with the result.

Hope this helps.

Regards,
Leonid


On Sat, Apr 24, 2010 at 1:02 AM, Robert Wright
<mathematicauser1 at yahoo.com>wrote:

> I am using a Graph Theory algorithm which requires that I multiply an
> edge-weighted adjacency matrix with symbolic parts. In my problem, the order
> of the symbols corresponds to the edges that make up a path - for example,
> x2 x1 x7 would indicate that the path progresses from x2 to x1 then x7. The
> snag comes when Mathematica reorders the symbols in each expression
> appearing in the matrix result from multiplying Ci x Cj - is there a way of
> stopping this from happening?
>
> Here is some code that illustrates the problem:
>
> C1 = {{0, x1, 0, 0}, {x2, 0, x3, 0}, {x4, 0, 0, x5}, {x6, 0, x7, 0}};
> C2 = C1.C1;
> MatrixForm@C2
>
> The MatrixForm output shows how Mathematica has sequenced the symbols in
> 'ascending' order. In my case, I want to preserve the order of the symbols
> in the calculated expression: so, for example, row 4 of C1 times column 2 of
> C1 should give x4 x1 and not x1 x4. How do I stop Mathematicafrom reordering
> the resulting expression?
>


  • Prev by Date: Re: Kernel crash, version 7.0, windows XP, when using
  • Next by Date: Re: Kernel crash, version 7.0, windows XP, when using slider in Manipulate with Dynamics plot on control area
  • Previous by thread: Re: Stop mathematica reordering expression during matrix
  • Next by thread: Re: Kernel crash, version 7.0, windows XP, when using