52 lines
1.2 KiB
Text
52 lines
1.2 KiB
Text
# -*- coding: utf-8 -*- #
|
|
|
|
# Define some generic matrix initialisation and printing operations #
|
|
|
|
COMMENT REQUIRES:
|
|
MODE SCAL = ~ # a scalar, eg REAL #;
|
|
MODE VEC = []SCAL;
|
|
FORMAT scal fmt := ~;
|
|
et al.
|
|
END COMMENT
|
|
|
|
INT mat lwb := 1, mat upb := 0;
|
|
MODE MATNEW = [mat lwb:mat upb, vec lwb: vec upb]SCAL; MODE MAT = REF MATNEW;
|
|
FORMAT mat fmt = $"("n(vec upb-vec lwb)(f(vec fmt)","lx)f(vec fmt)")"l$;
|
|
|
|
PRIO DIAGINIT = 1;
|
|
|
|
OP INIT = (MAT self, SCAL scal)MAT: (
|
|
FOR row FROM LWB self TO UPB self DO self[row,] INIT scal OD;
|
|
self
|
|
);
|
|
|
|
# ZEROINIT: defines the additive identity #
|
|
OP ZEROINIT = (MAT self)MAT:
|
|
self INIT SCAL(0);
|
|
|
|
OP REPR = (MATNEW self)STRING: (
|
|
FILE f; STRING s; associate(f,s);
|
|
vec lwb := 2 LWB self; vec upb := 2 UPB self;
|
|
mat lwb := LWB self; mat upb := UPB self;
|
|
putf(f, (mat fmt, self)); close(f);
|
|
s
|
|
);
|
|
|
|
OP DIAGINIT = (MAT self, VEC diag)MAT: (
|
|
ZEROINIT self;
|
|
FOR d FROM LWB diag TO UPB diag DO self[d,d]:= diag[d] OD;
|
|
# or alternatively using TORRIX ...
|
|
DIAG self := diag;
|
|
#
|
|
self
|
|
);
|
|
|
|
# ONEINIT: defines the multiplicative identity #
|
|
OP ONEINIT = (MAT self)MAT: (
|
|
ZEROINIT self DIAGINIT (LOC[LWB self:UPB self]SCAL INIT SCAL(1))
|
|
# or alternatively using TORRIX ...
|
|
(DIAG out) VECINIT SCAL(1)
|
|
#
|
|
);
|
|
|
|
SKIP
|