arithmetic/src/linearalgebra/matrix/Matrix.ig


GENERIC INTERFACE Matrix(R, V, MS, MI);
Arithmetic for Modula-3, see doc for details

Abstract: Matrix math


CONST Brand = R.Brand & "Matrix";

TYPE
  (**
     text form: "M2x6{
                 V6{a00,a01,a02,a03,a04,a05},
                 V6{a10,a11,a12,a13,a14,a15}
                 }"
  **)
  TRow = MS.TRow;
  TBody = MS.TBody;
  T = MS.T;

  TMRow = ARRAY OF T;
  TMBody = ARRAY OF TMRow;       (* matrix of matrices *)

PROCEDURE New (m, n: CARDINAL; ): T; (* make New mxn matrix *)

CONST
  NewZero = MS.NewZero;
  NewOne  = MS.NewOne;

PROCEDURE FromArray (READONLY x: TBody; ): T;
PROCEDURE RowFromArray (READONLY x: V.TBody; ): T;
PROCEDURE ColumnFromArray (READONLY x: V.TBody; ): T;
PROCEDURE DiagonalFromArray (READONLY x: V.TBody; ): T;
<* INLINE *>
PROCEDURE RowFromVector (x: V.T; ): T;
<* INLINE *>
PROCEDURE ColumnFromVector (x: V.T; ): T;
<* INLINE *>
PROCEDURE DiagonalFromVector (x: V.T; ): T;
PROCEDURE FromMatrixArray (READONLY x: TMBody; ): T;
PROCEDURE FromScalar (x: R.T; ): T;
PROCEDURE Copy (x: T; ): T;

PROCEDURE Cyclic (x: V.T; size: CARDINAL; shift: INTEGER := 1; ):
  T;                             (* each row is 'x' shifted by 'shift' to
                                    the right compared to the row above *)

CONST
  Add    = MI.Add;               (* x + y *)
  Sub    = MI.Sub;               (* x - y *)
  IsZero = MI.IsZero;
  Equal  = MI.Equal;             (* return v1=v2 *)

  Scale     = MI.Scale;          (* x:=x*factor *)
  Mul       = MI.Mul;            (* x * y *)
  MulV      = MI.MulV;           (* A * b *)
  MulTV     = MI.MulTV;          (* A^T * b or b^T*A *)
  Transpose = MS.Transpose;
  Adjoint   = MI.Adjoint;        (* x^* *)
  MulMMA    = MI.MulMMA;         (* x*x^* *)
  MulMAM    = MI.MulMAM;         (* x^**x *)

  Trace       = MI.Trace;        (* sum of the diagonal elements *)
  Determinant = MI.Determinant;

PROCEDURE GetRow (x: T; k: CARDINAL; ): V.T;
PROCEDURE GetColumn (x: T; k: CARDINAL; ): V.T;

TYPE
  ApplyFtn = PROCEDURE (x: R.T);
  MapFtn = PROCEDURE (x: R.T; ): R.T;
  ReduceFtn = PROCEDURE (x, y: R.T; ): R.T;

PROCEDURE Apply (x: T; f: ApplyFtn; );
PROCEDURE Map (x: T; f: MapFtn; ): T;
PROCEDURE ReduceRows (x: T; f: ReduceFtn; READONLY init: V.TBody; ): V.T;
PROCEDURE ReduceColumns (x: T; f: ReduceFtn; READONLY init: V.TBody; ):
  V.T;

END Matrix.