MathGroup Archive 1997

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

Search the Archive

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/


  • Prev by Date: Re: recovering from forgetfulness
  • Next by Date: Remote Kernel Operation
  • Previous by thread: Package for Blockmatrices
  • Next by thread: Kalman-Filter