## 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
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;
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.
```
```

```