|
a/MatLib.mod.m2pp |
|
b/MatLib.mod.m2pp |
|
... |
|
... |
65 |
(* 07.12.17, MRi: Einfuegen von StuerzMN,NeumaierSum & NeumaierProdSum *)
|
65 |
(* 07.12.17, MRi: Einfuegen von StuerzMN,NeumaierSum & NeumaierProdSum *)
|
66 |
(* aus Testumgebung *)
|
66 |
(* aus Testumgebung *)
|
67 |
(* 30.05.18, MRi: Einfuegen von TriInfNorm *)
|
67 |
(* 30.05.18, MRi: Einfuegen von TriInfNorm *)
|
68 |
(* 10.06.18, MRi: ZufallMat um den nicht-quadratischen Fall ergaenzt *)
|
68 |
(* 10.06.18, MRi: ZufallMat um den nicht-quadratischen Fall ergaenzt *)
|
69 |
(* 12.09.18, MRi: CMatVekProd erweitert und an MatVekProd angepasst *)
|
69 |
(* 12.09.18, MRi: CMatVekProd erweitert und an MatVekProd angepasst *)
|
|
|
70 |
(* 21.09.18, MRi: CStuerzMN eingefuegt *)
|
|
|
71 |
(* 28.09.18, MRi: MatNormL1 auf "Rechtecksfall" erweitert *)
|
|
|
72 |
(* 29.09.18, MRi: In StuerzMN & CStuerzMN das Nullsetzen der Restmatrix *)
|
|
|
73 |
(* ueberarbeitet, in CStuerzMN den Parameter IfConj *)
|
|
|
74 |
(* eingefuegt *)
|
70 |
(*------------------------------------------------------------------------*)
|
75 |
(*------------------------------------------------------------------------*)
|
71 |
(* Offene Punkte *)
|
76 |
(* Offene Punkte *)
|
72 |
(* *)
|
77 |
(* *)
|
73 |
(* - Nachsehen ob InitMat nicht "gelitten" hat *)
|
78 |
(* - Nachsehen ob InitMat nicht "gelitten" hat *)
|
74 |
(* - Komplexe Typen auf ISO M2 umstellen *)
|
79 |
(* - Komplexe Typen auf ISO M2 umstellen *)
|
|
... |
|
... |
90 |
(*------------------------------------------------------------------------*)
|
95 |
(*------------------------------------------------------------------------*)
|
91 |
(* Implementation : Michael Riedl *)
|
96 |
(* Implementation : Michael Riedl *)
|
92 |
(* Licence : GNU Lesser General Public License (LGPL) *)
|
97 |
(* Licence : GNU Lesser General Public License (LGPL) *)
|
93 |
(*------------------------------------------------------------------------*)
|
98 |
(*------------------------------------------------------------------------*)
|
94 |
|
99 |
|
95 |
(* $Id: MatLib.mod.m2pp,v 1.16 2018/06/09 13:29:13 mriedl Exp mriedl $ *)
|
100 |
(* $Id: MatLib.mod.m2pp,v 1.17 2019/02/01 22:24:03 mriedl Exp mriedl $ *)
|
96 |
|
101 |
|
97 |
FROM SYSTEM IMPORT TSIZE,ADR;
|
102 |
FROM SYSTEM IMPORT TSIZE,ADR;
|
98 |
FROM Storage IMPORT ALLOCATE,DEALLOCATE;
|
103 |
FROM Storage IMPORT ALLOCATE,DEALLOCATE;
|
99 |
FROM Deklera IMPORT VEKTOR,MATRIX,SUPERVEKTOR,PMATRIX,MaxDim,
|
104 |
FROM Deklera IMPORT VEKTOR,MATRIX,SUPERVEKTOR,PMATRIX,MaxDim,
|
100 |
CVEKTOR,CMATRIX;
|
105 |
CVEKTOR,CMATRIX;
|
101 |
FROM Errors IMPORT Fehlerflag,Fehler;
|
106 |
FROM Errors IMPORT Fehlerflag,Fehler;
|
102 |
IMPORT Errors;
|
107 |
IMPORT Errors;
|
103 |
FROM LongMath IMPORT sqrt;
|
108 |
FROM LongMath IMPORT sqrt;
|
104 |
IMPORT LongComplexMath;
|
109 |
IMPORT LongComplexMath;
|
|
|
110 |
FROM LMathLib IMPORT MaxCard;
|
105 |
FROM RandomLib IMPORT Zufall;
|
111 |
FROM RandomLib IMPORT Zufall;
|
106 |
FROM LibDBlas IMPORT idamax,dscal;
|
112 |
FROM LibDBlas IMPORT idamax,dscal;
|
107 |
IMPORT LibDBlasM2;
|
113 |
IMPORT LibDBlasM2;
|
108 |
FROM DynMat IMPORT AllocMat,DeAllocMat;
|
114 |
FROM DynMat IMPORT AllocMat,DeAllocMat;
|
109 |
|
115 |
|
|
... |
|
... |
524 |
END Stuerz;
|
530 |
END Stuerz;
|
525 |
|
531 |
|
526 |
PROCEDURE StuerzMN(VAR A : ARRAY OF ARRAY OF LONGREAL;
|
532 |
PROCEDURE StuerzMN(VAR A : ARRAY OF ARRAY OF LONGREAL;
|
527 |
M,N : CARDINAL);
|
533 |
M,N : CARDINAL);
|
528 |
|
534 |
|
529 |
VAR i,j : CARDINAL;
|
535 |
VAR i,j,mn : CARDINAL;
|
530 |
T : PMATRIX;
|
536 |
T : PMATRIX;
|
531 |
BEGIN
|
537 |
BEGIN
|
|
|
538 |
IF (M = N) THEN
|
|
|
539 |
Stuerz(A,N);
|
|
|
540 |
ELSE
|
|
|
541 |
mn := MaxCard(M,N);
|
532 |
IF (HIGH(A) < N) OR (HIGH(A[0]) < M) THEN
|
542 |
IF (HIGH(A) < mn) OR (HIGH(A[0]) < mn) THEN
|
533 |
Errors.FatalError("Matrix A falsch dimensioniert (MatLib.StuerzMN)");
|
543 |
Errors.FatalError("Matrix A falsch dimensioniert (MatLib.StuerzMN)");
|
534 |
END;
|
544 |
END;
|
535 |
AllocMat(T,M,N);
|
545 |
AllocMat(T,M,N);
|
536 |
IF (T = NIL) THEN
|
546 |
IF (T = NIL) THEN
|
537 |
Errors.FatalError("Kein Freispeicher vorhanden (MatLib.StuerzMN)");
|
547 |
Errors.FatalError("Kein Freispeicher vorhanden (MatLib.StuerzMN)");
|
538 |
END;
|
548 |
END;
|
|
|
549 |
|
539 |
FOR i:=0 TO M-1 DO
|
550 |
FOR i:=0 TO M-1 DO
|
540 |
FOR j:=0 TO N-1 DO T^[i+1]^[j+1]:=A[i,j]; END;
|
551 |
FOR j:=0 TO N-1 DO T^[i+1]^[j+1]:=A[i,j]; END;
|
541 |
END;
|
552 |
END;
|
542 |
FOR i:=N TO HIGH(A) DO
|
553 |
|
543 |
FOR j:=M TO HIGH(A[0]) DO
|
554 |
IF (1 = 1) THEN (* This code is not really necessary *)
|
544 |
A[i,j]:=0.0;
|
555 |
(* Initialisiere den Rest der (quadratischen) Matrix mit 0 *)
|
|
|
556 |
IF (N < M) THEN
|
|
|
557 |
FOR i:=N TO M-1 DO
|
|
|
558 |
FOR j:=0 TO M-1 DO A[i,j]:=0.0; END;
|
545 |
END;
|
559 |
END;
|
|
|
560 |
ELSE
|
|
|
561 |
FOR i:=0 TO N-1 DO
|
|
|
562 |
FOR j:=M TO N-1 DO A[j,i]:=0.0; END;
|
546 |
END;
|
563 |
END;
|
|
|
564 |
END; (* IF M > N *)
|
|
|
565 |
END; (* IF *)
|
|
|
566 |
|
547 |
FOR i:=0 TO M-1 DO
|
567 |
FOR i:=0 TO M-1 DO
|
548 |
FOR j:=0 TO N-1 DO A[j,i]:=T^[i+1]^[j+1]; END;
|
568 |
FOR j:=0 TO N-1 DO
|
|
|
569 |
A[j,i]:=T^[i+1]^[j+1];
|
|
|
570 |
END;
|
549 |
END;
|
571 |
END;
|
|
|
572 |
|
550 |
DeAllocMat(T,M,N);
|
573 |
DeAllocMat(T,M,N);
|
|
|
574 |
END;
|
551 |
END StuerzMN;
|
575 |
END StuerzMN;
|
|
|
576 |
|
|
|
577 |
PROCEDURE CStuerzMN(VAR A : ARRAY OF ARRAY OF LONGCOMPLEX;
|
|
|
578 |
M,N : CARDINAL;
|
|
|
579 |
IfConj : BOOLEAN);
|
|
|
580 |
|
|
|
581 |
VAR i,j,mn : CARDINAL;
|
|
|
582 |
Tre,Tim : PMATRIX;
|
|
|
583 |
BEGIN
|
|
|
584 |
IF (M = N) THEN
|
|
|
585 |
CStuerz(A,N,IfConj);
|
|
|
586 |
ELSE
|
|
|
587 |
mn := MaxCard(M,N);
|
|
|
588 |
IF (HIGH(A) < mn) OR (HIGH(A[0]) < mn) THEN
|
|
|
589 |
Errors.FatalError("Matrix A falsch dimensioniert (MatLib.StuerzMN)");
|
|
|
590 |
END;
|
|
|
591 |
AllocMat(Tre,M,N);
|
|
|
592 |
AllocMat(Tim,M,N);
|
|
|
593 |
IF (Tre = NIL) OR (Tim = NIL) THEN
|
|
|
594 |
Errors.FatalError("Kein Freispeicher vorhanden (MatLib.CStuerzMN)");
|
|
|
595 |
END;
|
|
|
596 |
FOR i:=0 TO M-1 DO
|
|
|
597 |
FOR j:=0 TO N-1 DO
|
|
|
598 |
Tre^[i+1]^[j+1] := RE(A[i,j]);
|
|
|
599 |
Tim^[i+1]^[j+1] := IM(A[i,j]);
|
|
|
600 |
END;
|
|
|
601 |
END;
|
|
|
602 |
|
|
|
603 |
IF (1 = 1) THEN (* This code is not really necessary *)
|
|
|
604 |
(* Initialisiere den Rest der (quadratischen) Matrix mit 0 *)
|
|
|
605 |
IF (N < M) THEN
|
|
|
606 |
FOR i:=N TO M-1 DO
|
|
|
607 |
FOR j:=0 TO M-1 DO A[i,j]:=zero; END;
|
|
|
608 |
END;
|
|
|
609 |
ELSE
|
|
|
610 |
FOR i:=0 TO N-1 DO
|
|
|
611 |
FOR j:=M TO N-1 DO A[i,j]:=zero; END;
|
|
|
612 |
END;
|
|
|
613 |
END; (* IF M > N *)
|
|
|
614 |
END; (* IF *)
|
|
|
615 |
FOR i:=0 TO M-1 DO
|
|
|
616 |
IF IfConj THEN
|
|
|
617 |
FOR j:=0 TO N-1 DO
|
|
|
618 |
A[j,i]:=CMPLX(Tre^[i+1]^[j+1], - Tim^[i+1]^[j+1]);
|
|
|
619 |
END;
|
|
|
620 |
ELSE
|
|
|
621 |
FOR j:=0 TO N-1 DO
|
|
|
622 |
A[j,i]:=CMPLX(Tre^[i+1]^[j+1], Tim^[i+1]^[j+1]);
|
|
|
623 |
END;
|
|
|
624 |
END; (* IF *)
|
|
|
625 |
END;
|
|
|
626 |
DeAllocMat(Tre,M,N);
|
|
|
627 |
DeAllocMat(Tim,M,N);
|
|
|
628 |
END;
|
|
|
629 |
END CStuerzMN;
|
552 |
|
630 |
|
553 |
PROCEDURE Transpose(VAR A : ARRAY OF ARRAY OF LONGREAL;
|
631 |
PROCEDURE Transpose(VAR A : ARRAY OF ARRAY OF LONGREAL;
|
554 |
n : CARDINAL);
|
632 |
n : CARDINAL);
|
555 |
|
633 |
|
556 |
(*----------------------------------------------------------------*)
|
634 |
(*----------------------------------------------------------------*)
|
|
... |
|
... |
1598 |
END;
|
1676 |
END;
|
1599 |
RETURN norm;
|
1677 |
RETURN norm;
|
1600 |
END TriInfNorm;
|
1678 |
END TriInfNorm;
|
1601 |
|
1679 |
|
1602 |
PROCEDURE MatNormL1(VAR A : ARRAY OF ARRAY OF LONGREAL;
|
1680 |
PROCEDURE MatNormL1(VAR A : ARRAY OF ARRAY OF LONGREAL;
|
1603 |
N : INTEGER;
|
1681 |
M,N : CARDINAL;
|
1604 |
VAR Norm : LONGREAL);
|
1682 |
VAR Norm : LONGREAL);
|
1605 |
|
1683 |
|
1606 |
VAR i,j : INTEGER;
|
1684 |
VAR i,j : CARDINAL;
|
1607 |
Sum : LONGREAL;
|
1685 |
Sum : LONGREAL;
|
1608 |
BEGIN
|
1686 |
BEGIN
|
1609 |
Norm:=0.0;
|
1687 |
Norm:=0.0;
|
1610 |
FOR i:=0 TO N-1 DO
|
1688 |
FOR i:=0 TO M-1 DO
|
1611 |
Sum:=0.0;
|
1689 |
Sum:=0.0;
|
1612 |
FOR j:=0 TO N-1 DO Sum:=Sum + ABS(A[i,j]); END;
|
1690 |
FOR j:=0 TO N-1 DO Sum:=Sum + ABS(A[i,j]); END;
|
1613 |
IF (Sum > Norm) THEN Norm:=Sum; END;
|
1691 |
IF (Sum > Norm) THEN Norm:=Sum; END;
|
1614 |
END;
|
1692 |
END;
|
1615 |
END MatNormL1;
|
1693 |
END MatNormL1;
|