Re: Automatic Display in MatrixForm
- To: mathgroup at smc.vnet.net
- Subject: [mg19259] Re: [mg19206] Automatic Display in MatrixForm
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Thu, 12 Aug 1999 01:24:18 -0400
- References: <7or4k5$13j@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Ted,
Two comments: A) and B)
I show the outputs in InputForm and indented
(of course we can always use TraditionalForm: Cell>Default Output
Format>TraditionalForm)
A) There are still problems:
$Post = (# /. x_?MatrixQ :> MatrixForm[x]) &;
mtrx = {{2, 0, 0}, {0, -1, 0}, {0, 0, 3}}
MatrixForm[{{2, 0, 0}, {0, -1, 0}, {0, 0, 3}}]
mtrx.a
MatrixForm[{{2, 0, 0}, {0, -1, 0}, {0, 0, 3}}] . a
% /. a -> mtrx
MatrixForm[MatrixForm[{{2, 0, 0}, {0, -1, 0},
{0, 0, 3}}]] . MatrixForm[{{2, 0, 0}, {0, -1, 0},
{0, 0, 3}}]
The MatrixForm wrappers prevent the Dot product.
B) Perhaps a more general solution is as follows (where MatrixForm is first
replaces by Identity to allow evaluation, and is then replaced
appropriately). I await a list of problems with this also!
$Post = (# /. MatrixForm -> Identity /. x_?MatrixQ :> MatrixForm[x]) &;
mtrx = {{2, 0, 0}, {0, -1, 0}, {0, 0, 3}}
MatrixForm[{{2, 0, 0}, {0, -1, 0}, {0, 0, 3}}]
mtrx.a
MatrixForm[{{2, 0, 0}, {0, -1, 0}, {0, 0, 3}}] . a
% /. a -> mtrx
MatrixForm[{{4, 0, 0}, {0, 1, 0}, {0, 0, 9}}]
Ersek, Ted R <ErsekTR at navair.navy.mil> wrote in message
news:7or4k5$13j at smc.vnet.net...
> Bruno Daniel wrote:
> ----------------------
> I found a way to display matrices automatically in MatrixForm
> without having to place the annoying "// MatrixForm" in the end
> of each line. Just put the following line into your init.m:
>
> $Post=(#/.x_?MatrixQ->MatrixForm[x])&
>
> This also works for output that doesn't *consist* of a matrix, but
> *contains* matrices.
> ----------------------------
>
> That's nice, but it sometimes spells disaster.
>
>
> In[1]:=
> $Post=(#/.x_?MatrixQ->MatrixForm[x])&;
>
> In[2]:=
> x=3+y;
>
> In[3]:=
> mtrx={{2,0,0},{0,-1,0},{0,0,3}}
>
> Out[3]//MatrixForm=
> 3+y
>
>
> What *%&^ !!
> -----------------
>
> You used (lhs->rhs) in $Post, and Rule uses the global value of (x) in
> (rhs). Hence the result in Out[3] is very wrong! However, (mtrx)
actually
> has the right value. Below the first row of (mtrx) is displayed.
>
>
> In[4]:=
> First[mtrx]
>
> Out[4]=
> {2,0,0}
>
> -----------------------------
> What you need to do is use (lhs:>rhs) as below.
>
> In[5]:=
> $Post=(#/.x_?MatrixQ:>MatrixForm[x])&;
>
> In[6]:=
> mtrx
>
> Out[6]//MatrixForm=
> (* The desired output is displayed. *)
>
> ----------------------------
>
> It's no wonder people keep making this mistake in spite of me pointing it
> out over and over. The Mathematica Book (all editions) are full of
examples
> that will give the same type of error when the variable used has a global
> value. The book does nothing to warn users about this problem, or how to
> avoid it. Has Stephen Wolfram not been aware of this for the past 10
years,
> or does he think it's in his best interest to avoid bringing it to our
> attention?
>
> As far as I can tell WRI tech support doesn't have a web page addressing
> this problem.
>
> Besides that there are dozens of books written about how to use
Mathematica.
> I have yet to find one that mentions this problem. It's even more
puzzling
> why few if any of the other books discuss this point.
>
> -------------
> Regards,
> Ted Ersek
>