Re: Transpose matrix does not work when MatrixForm is used, why?
- To: mathgroup at smc.vnet.net
- Subject: [mg45398] Re: Transpose matrix does not work when MatrixForm is used, why?
- From: Dr Bob <drbob at bigfoot.com>
- Date: Tue, 6 Jan 2004 04:16:56 -0500 (EST)
- References: <0BB4C7A6482ABB4EB233E1EF37A399CDE19C10@NAEAPAXREX10VA.nadsusea.nads.navy.mil>
- Reply-to: drbob at bigfoot.com
- Sender: owner-wri-mathgroup at wolfram.com
Great work!
But.... MatrixForm@m (when m is already MatrixForm) is an infinite loop.
After some laborious sleuthing, I found that adding MatrixQ to the
HeadTest list fixes that:
Unprotect[MatrixForm];
HeadTest[func_] := Intersection[{func}, {
If, List, Set, SetDelayed, UpSet, UpSetDelayed,
TagSet, TagSetDelayed,
Format, MakeBoxes, MakeExpression, ToBoxes, Shallow, Short,
Hold, HoldForm, HoldComplete, HoldPattern,
Verbatim, Blank, BlankSequence,
BlankNullSequence, Alternatives, Pattern, Optional, Repeated, \
RepeatedNull, Condition, PatternTest, Rule, RuleDelayed,
FullForm, InputForm, MatrixQ}] === {}
MatrixForm /: (f_?HeadTest)[a1___, a2_MatrixForm, a3___] := Module[{
result}, result = Replace[{a1, a2, a3}, MatrixForm -> Identity, 2,
\
Heads -> True];
result = f @@ result;
If[MatrixQ@result, MatrixForm[result], result]]
Protect[MatrixForm];
BUT... now MatrixQ@m isn't True, and that's not good, is it?
Bobby
On Mon, 5 Jan 2004 15:29:45 -0500, Ersek, Ted CIV NASPATUXENTRIVERMD
4.5.1.2 <ted.ersek at navy.mil> wrote:
> Recall the recent thread on how do ensure we can do math on matrices
> wrapped in MatrixForm.
> Apparently other solutions didn't quite do the trick. I think the code
> below is better.
> (*------------------------------------------*)
>
> Unprotect[MatrixForm];
>
> HeadTest[func_]:= Intersection[{func},
> {If,List,Set,SetDelayed,UpSet,UpSetDelayed,TagSet,TagSetDelayed,Format,
> MakeBoxes,MakeExpression,ToBoxes,Shallow,Short,Hold,HoldForm,HoldComplete,
> HoldPattern,Verbatim,Blank,BlankSequence,BlankNullSequence,Alternatives,
> Pattern,Optional,Repeated,RepeatedNull,Condition,PatternTest,Rule,
> RuleDelayed,FullForm,InputForm
> }]==={}
>
>
> MatrixForm/:(f_?HeadTest)[a1___, a2_MatrixForm, a3___]:=
> Module[{result},
> result = Replace[ {a1,a2,a3}, MatrixForm->Identity, 2, Heads->True ];
> result = f@@result;
> If[ MatrixQ@result, MatrixForm[result], result ]
> ]
>
>
> (*---------------------------------------------------------*)
> Now we can do the following and get the output in MatrixForm.
>
>
> m1=MatrixForm[{{2,3,4},{1,5,2},{6,3,1}}]
>
> Inverse[m1]
>
> MatrixPower[m1,4]
>
> m2={{2,0,4},{0,5,2},{0,3,1}};
> m1.m1.m1.m2
>
> Det[m1]
>
> Part[m1,1,3]
>
>
> ----------------
> Regards,
> Ted Ersek
>
> Download Mathematica Tips From
> http://www.verbeia.com/mathematica/tips/Tricks.html
>
>
>