DIRECTORY Rope USING [ROPE], Basics, IO USING [STREAM], AlgebraClasses; Matrices: CEDAR DEFINITIONS ~ BEGIN OPEN AC: AlgebraClasses; Matrix: TYPE = REF MatrixRec; MatrixRec: TYPE = RECORD[ size: NAT _ 0, rows: RowSeq _ NIL ]; RowSeq: TYPE = REF RowSeqRec; RowSeqRec: TYPE = RECORD[SEQUENCE rowsPlusOne: [1..100] OF Row]; Row: TYPE = REF RowRec; RowRec: TYPE = RECORD[SEQUENCE columnsPlusOne: [1..100] OF REF]; Column: TYPE = REF ColumnRec; ColumnRec: TYPE = RECORD[SEQUENCE rowsPlusOne: [1..100] OF REF]; matrixRingClass: AC.StructureClass; -- Class record for all matrix rings, i.e. matrices over a ring which is not a field. matrixAlgebraClass: AC.StructureClass; -- Class record for matrix algebras which are not division algebras MatrixStructureData: TYPE = REF MatrixStructureDataRec; MatrixStructureDataRec: TYPE = RECORD [ elementStructure: AC.Structure, size: NAT ]; DiagonalMatrixConstructorOp: TYPE = PROC [element: REF, size: NAT, elementStructure: AC.Structure] RETURNS [out: Matrix]; MatrixOps: TYPE = REF MatrixOpsRec; -- prop key is $MatrixRing. MatrixOpsRec: TYPE = RECORD [ diagonalMatrix: DiagonalMatrixConstructorOp, transpose: AC.UnaryOp, determinant: AC.StructuredToGroundOp ]; MakeMatrixRing: PROC [elementStructure: AC.Structure, size: NAT] RETURNS [matrixRing: AC.Structure]; MakeMatrixAlgebra: PROC [elementField: AC.Structure, size: NAT] RETURNS [matrixAlgebra: AC.Structure]; IsMatrixRing: PROC [structure: AC.Structure] RETURNS [BOOL]; Transpose: PROC [structure: AC.Structure] RETURNS [AC.UnaryOp]; Determinant: PROC [structure: AC.Structure] RETURNS [AC.StructuredToGroundOp]; DiagMatrix: DiagonalMatrixConstructorOp; ReadMatrix: PROC [in: IO.STREAM, size: NAT, elementStructure: AC.Structure] RETURNS [matrix: Matrix]; MatrixFromRope: PROC [in: Rope.ROPE, size: NAT, elementStructure: AC.Structure] RETURNS [out: Matrix]; MatrixToRope: PROC [in: Matrix, elementStructure: AC.Structure] RETURNS [out: Rope.ROPE]; WriteMatrix: PROC [in: Matrix, elementStructure: AC.Structure, out: IO.STREAM]; Add: PROC [in1, in2: Matrix, elementStructure: AC.Structure] RETURNS [out: Matrix]; Negate: PROC [in: Matrix, elementStructure: AC.Structure] RETURNS [out: Matrix]; Subtract: PROC [in1, in2: Matrix, elementStructure: AC.Structure] RETURNS [Matrix]; Multiply: PROC [in1, in2: Matrix, elementStructure: AC.Structure] RETURNS [out: Matrix]; Invert: PROC [in: Matrix, elementField: AC.Structure] RETURNS [out: Matrix]; Divide: PROC [in1, in2: Matrix, elementField: AC.Structure] RETURNS [out: Matrix]; ScalarMultiply: PROC [scalar: REF, inMatrix: Matrix, elementField: AC.Structure] RETURNS [outMatrix: Matrix]; Equal: PROC [in1, in2: Matrix, elementStructure: AC.Structure] RETURNS [BOOL]; Transp: PROC [in: Matrix] RETURNS [out: Matrix]; Det: PROC [in: Matrix, elementStructure: AC.Structure] RETURNS [value: REF]; END. φMatrices.mesa Last Edited by: Arnon, March 5, 1986 10:49:31 am PST Square matrices over a ring (yielding a ring) or a field (yielding an algebra). Matrix Representation Classes for Matrix Rings and Matrix Algebras Instance Data for Matrix Rings and Matrix Algebras Operations unique to Matrix Rings and Matrix Algebras Matrix Ring and Matrix Algebra Constructors A particular matrixRing is defined by its elementStructure and its size. elementStructure can be a ring, field (although MakeMatrixAlgebra should be used in this case), or algebra. Extract Matrix Operations from Class Property Lists Extract the transpose op from a $MatrixRing. Extract the determinant op from a $MatrixRing. Constructors Conversion and IO Arithmetic Matrix Operations Κ’˜Jšœ ™ J™4J˜šΟk ˜ Jšœœœ˜J˜Jšœœœ˜Jšœ˜—J˜JšœO™OJ˜head2šœ œ ˜J˜—Jšœœœœ˜!headšΟn™Jšœœœ ˜šœ œœ˜Jšœœ˜Jšœœ˜—Jšœœœ ˜Jš œ œœœœ˜@Jšœœœ˜Jš œœœœœœ˜@Jšœœœ ˜Jš œ œœœœœ˜@—šœ,™,IcodešœœΟcU˜zM˜MšœœŸC˜k—šœ2™2Mšœœœ˜7šœœœ˜'Mšœœ ˜Mšœ˜ M˜——šœ5™5Jšžœœœ œœœ œ˜yJ˜Mšœ œœŸ˜?šœœœ˜Mšœ,˜,Mšœ œ ˜Mšœ œ˜$M˜——šœ+™+š žœœœœœœ ˜dJšœ΄™΄J™—Mš žœœœœœœ ˜f—šœ3™3š ž œœ œ œœ˜