RE: Re: Automatic Display in MatrixForm
- To: mathgroup at smc.vnet.net
- Subject: [mg19445] RE: [mg19413] Re: Automatic Display in MatrixForm
- From: "Ersek, Ted R" <ErsekTR at navair.navy.mil>
- Date: Wed, 25 Aug 1999 01:25:15 -0400
- Sender: owner-wri-mathgroup at wolfram.com
Daniel Bruno wrote a function (switchMatrixForm) where evaluating switchMatrixForm[9,6] would cause matrices with fewer than 9 rows and fewer than 6 columns to be displayed in the equivalent of MatrixForm. The solution in question involved a complicated rule for MakeBoxes that Dave Withoff helped me write. ------------------------------ Question: Does the method using a rule for MakeBoxes have an advantage over something along the lines: $PrePrint =(#/.x_?MatrixQ:>MatrixForm[x])&; -------------------------------- Defining switchMatrixForm based on the complicated rule using MakeBoxes as Daniel Bruno wrote it has a problem. Suppose you evaluate switchMatrixForm[10,10] Later you decide you only want to use MatrixForm for matrices that are 3x3 or smaller. To do that you might evaluate. switchMatrixForm[4,4] But doing that will not undo the rule from the earlier use of switchMatrixForm. To correct this problem you can use my new version below. With my version switchMatrixForm[m,n] doesn't make a new rule for MakeBoxes until it deletes any and all MakeBoxes rules that switchMatrixForm would have made earlier, but it leaves any other rules for MakeBoxes as they are. I can email a notebook with this code to anyone who would find that easier to work with. -------------------------------- RuleTest[a_]:=With[{MB,PT,Patt,RD,Fun,rule1},( rule1=ReleaseHold[Extract[a,{1,1},Hold]/. {MakeBoxes->MB,PatternTest->PT,Pattern->Patt, RuleDelayed->RD,Function->Fun,Verbatim[Blank][]->Bk}]; MatchQ[rule1, MB[PT[Patt[_Symbol,Bk],Fun[t_Symbol, MatrixQ[Unevaluated[t]]&&t=!={{}}&&Length[t]<_&& Last[Dimensions[t]]<_,HoldAll]],StandardForm] ] )] switchMatrixForm[rows_Integer?Positive, columns_Integer?Positive]:=( FormatValues[MakeBoxes]= DeleteCases[FormatValues[MakeBoxes],_?RuleTest]; MakeBoxes[m_?(Function[t,MatrixQ[Unevaluated[t]]&& (t=!={{}})&&Length[t]<=rows&& Last[Dimensions[t]]<=columns,HoldAll]),StandardForm]:= RowBox[{"(", GridBox[Map[ Function[t,MakeBoxes[t,StandardForm],HoldAll],Unevaluated[m],{2}]], ")" }]) switchMatrixForm[0,_Integer?NonNegative]:= FormatValues[MakeBoxes]=DeleteCases[FormatValues[MakeBoxes],_?RuleTest]; switchMatrixForm[_Integer?NonNegative,0]:= FormatValues[MakeBoxes]=DeleteCases[FormatValues[MakeBoxes],_?RuleTest]; ------------------- Other changes I made: I think it's more intuitive to have switchMatrixForm[m,n] use MatrixForm for matrices with (rows<=m) && (columns<=n) That is the way I wrote it. Using the code above switchMatrixForm[0,_Integer?NonNegative] switchMatrixForm[_Integer?NonNegative,0] will remove any MakeBoxes definitions that switchMatrixForm would have made, and nothing else. It seems Last[Dimensions[m]] is a little faster than Part[Dimension[m],2] I am splitting hairs here, since the impact is negligible. I also think it's clear a package should be used with (RuleTest) being a Private symbol in the package. I left that part for you to do. -------------------- Regards, Ted Ersek For Mathematica tips, tricks see http://www.dot.net.au/~elisha/ersek/Tricks.html