--- a/MatLib.mod.m2pp
+++ b/MatLib.mod.m2pp
@@ -66,6 +66,7 @@
(* aus Testumgebung *)
(* 30.05.18, MRi: Einfuegen von TriInfNorm *)
(* 10.06.18, MRi: ZufallMat um den nicht-quadratischen Fall ergaenzt *)
+ (* 12.09.18, MRi: CMatVekProd erweitert und an MatVekProd angepasst *)
(*------------------------------------------------------------------------*)
(* Offene Punkte *)
(* *)
@@ -942,21 +943,42 @@
END;
END MatVekProd;
-PROCEDURE CMatVekProd(VAR X : ARRAY OF LONGCOMPLEX;
- VAR Mat : ARRAY OF ARRAY OF LONGCOMPLEX;
- Vek : ARRAY OF LONGCOMPLEX;
- dim : CARDINAL); (* Dim d. Matrix *)
-
- VAR i,j : CARDINAL;
- CSum : LONGCOMPLEX;
-BEGIN
- FOR i:=0 TO dim-1 DO
- CSum:=CMPLX(0.0,0.0);
- FOR j:=0 TO dim-1 DO
- CSum:=CSum + Mat[i,j]*Vek[j];
- END;
- X[i]:=CSum;
- END; (* FOR i *)
+PROCEDURE CMatVekProd(VAR Y : ARRAY OF LONGCOMPLEX;
+ VAR A : ARRAY OF ARRAY OF LONGCOMPLEX;
+ X : ARRAY OF LONGCOMPLEX;
+ M,N : CARDINAL;
+ trans : CHAR);
+
+ VAR i,j : CARDINAL;
+ Xi,Yi : LONGCOMPLEX;
+BEGIN
+ IF (CAP(trans) = "N") THEN (* y = A*x *)
+ FOR i:=0 TO M-1 DO
+ Yi := zero;
+ FOR j:=0 TO N-1 DO Yi:=Yi + A[i,j]*X[j]; END;
+ Y[i]:=Yi;
+ END;
+ ELSIF (CAP(trans) = "T") THEN (* y = A^{tr}*x *)
+ FOR j:=0 TO N-1 DO Y[j]:=zero; END;
+ FOR i:=0 TO M-1 DO
+ IF (X[i] # zero) THEN
+ Xi := X[i];
+ FOR j:=0 TO N-1 DO Y[j]:=Y[j] + A[i,j]*Xi; END;
+ END;
+ END;
+ ELSIF (CAP(trans) = "C") THEN (* y = conj(A^{tr})*x *)
+ FOR j:=0 TO N-1 DO Y[j]:=zero; END;
+ FOR i:=0 TO M-1 DO
+ IF (X[i] # zero) THEN
+ Xi := X[i];
+ FOR j:=0 TO N-1 DO
+ Y[j]:=Y[j] + LongComplexMath.conj(A[i,j])*Xi;
+ END;
+ END;
+ END;
+ ELSE
+ Errors.FatalError("trans # CAP({N|T|C}) (CMatVekProd)");
+ END;
END CMatVekProd;
PROCEDURE SvVekProd(VAR Y : ARRAY OF LONGREAL; (* ==> *)