Re: Package for Blockmatrices
- To: mathgroup at smc.vnet.net
 - Subject: [mg7778] Re: Package for Blockmatrices
 - From: Hans Steffani <hans.steffani at e-technik.tu-chemnitz.de>
 - Date: Tue, 8 Jul 1997 22:40:58 -0400
 - Sender: owner-wri-mathgroup at wolfram.com
 
>As you maybe saw, I am working on a package which handles 
>symbolik block matrices ie matrices which elements are
>matrices themselfes. This leads to different behavior of
>Dot and Transpose which are implemented in the package.
>The package seems to work but I am not sure whether the
>simplify functions are optimal concerning calculating time.
>I hope to get some hints but also that the package may be
>interesting for other mathematica users.
I solved some errors (maybe is made some new ones) and
changed the head of the both simplify functions.
Hans Friedrich Steffani
             --snip--snap--begin of block.m--snip--snap--
(*
   block.m
   Handles the dot product of symbolik block matrix.
   This means that the elements of a matrix are not skalars
   but matrices.
   eg:
   (A11 A12) (B11 B12)   (A11.B11+A12.B21  A11.B12+A12.B22)
   (       ) (       ) = (                                )
   (A21 A22) (B21 B22)   (A21.B11+A22.B21  A21.B12+A22.B22)
   using the dot product on the right hand side instead of
   the normal times.
   Also Transpose[] has been enhaced because not only the
   blockmatrix itsself but also its elements have to be
   transposed.
   Todos: SymmetricSimplify[] and DotSimplify[] should become part
   of Simplify[]. An Inverse[] and Det[] have to be adapte to this
   purpose.
   Hans Friedrich Steffani
   Version 0.11 End fixed
           0.2  Functions changed
           0.21 Functions which are not needed are removed
*)
BeginPackage["Utilities`Block`"]
DotSimplify::usage = 
"DotSimplify[expr, Scalars->{list of scalars}] replaces Dot[a,b]
by Times[a,b] if a or b are in the list of scalars"
Scalars::usage =
"Scalars is an option for DotSimplify[expr, Scalars->{list of scalars}."
SymmetricSimplify::usage =
"SymmetricSimplify[expr, Symmetric->{list of symmetric values}]
replaces Transpose[a] if a is in the list of symmetric values"
Symmetrics::usage =
"Symmetrics is an option for SymmetricSimplify which indicates
symmetric matrices."
Begin["`Private`"]
Unprotect[Transpose]
(* To Transpose the matrix all Elements get transposed
   and the matrix itself too *)
Transpose[m_?MatrixQ] := Transpose[Map[Transpose, m,{2}],
                                   {2,1}]
Transpose[m_?NumberQ] := m
Transpose[Transpose[expr_]] := expr
Protect[Transpose]
Unprotect[Dot]
Dot[a_?MatrixQ, b_?MatrixQ] := Inner[Dot, a, b, Plus]
Dot[a_?NumberQ, b_] := Times[a, b]
Dot[a_, b_?NumberQ] := Times[a, b]
Protect[Dot]
DotSimplify[expr_,
         opt:Scalars->theScalars_List] :=
Module[{},
Unprotect[mydot];
Clear[mydot];
mydot[m1_/; (MemberQ[theScalars,m1]), m2_ ] := Times[m1,m2] ;
mydot[m1_, m2_/; (MemberQ[theScalars,m2]) ] := Times[m1,m2] ;
SetAttributes[ mydot,{Flat,OneIdentity} ];
Protect[mydot];
mytranspose[ m_/; (MemberQ[theScalars,m]) ] := m;
expr/.{Dot->mydot,Transpose->mytranspose}/.{mydot->Dot,mytranspose->Transpose}
]
SymmetricSimplify[expr_,
                  opt:Symmetrics->theSymmetrics_List ] :=
Module[{},
Clear[mytranspose];
mytranspose[ m_/;(MemberQ[ theSymmetrics, m]) ] := m;
expr/.{Transpose->mytranspose}/.{mytranspose->Transpose}
]
Unprotect[Simplify]
Protect[Simplify]
End[] (* Private *)
EndPackage[]
             --snip--snap--end of block.m--snip--snap--
-- 
Hans Friedrich Steffani
Institut fuer Elektrische Maschinen und Antriebe, TU Chemnitz-Zwickau
mailto:hans.steffani at e-technik.tu-chemnitz.de
http://www.tu-chemnitz.de/~hfst/