1 /*****************************************************************************
3 * Zweck : Funktionen für Matrixinversion, Matrizenmultipli- *
4 * kation und Matrizenzugriff *
5 * Autor : Stefan Förster *
7 * Datum | Version | Bemerkung *
8 * -----------|---------|--------------------------------------------------- *
12 * 05.01.1989 | | Invers() *
13 * 18.01.1989 | | Mult() ohne M() und SetM() *
14 * 30.01.1989 | | Invers() ohne Verwendung von LRSubst(),LRPart()) *
15 * | | Bug in M(): Typumwandlung (LONG) wegen Overflow *
16 * | | Bug in SetM(): Typumwandlung (LONG) wegen Overflow *
17 * 06.02.1989 | 0.0 | Invers() ohne M() u. SetM(); Anpassung an ASimplex *
18 * | | Mult() angepaßt an ASimplex *
19 * | | M() angepaßt an ASimplex *
20 * | | SetM() angepaßt an ASimplex *
21 * 02.03.1989 | 0.1 | Bug in M(): if(flag==PHASE_I) statt if(PHASE_I) *
22 * 07.03.1989 | 1.0 | Bug in Invers(): fabs() statt ABS() (Typ SHORT !!) *
23 *****************************************************************************/
28 /*****************************************************************************
29 * USHORT Invers(inv,n,p) *
30 * Zweck : Berechnung der inversen Matrix mit Hilfe des Gauß-Algorithmus *
31 * Input : inv - Matrix, von der die inverse Matrix berechnet werden *
33 * n - Größe der (n,n)-Matrix *
34 * Output : inv - inverse Matrix *
35 * p - n-Permutationsvektor *
36 * Ergebnis : INVERTABLE/NOT_INVERTABLE *
37 *****************************************************************************/
39 #include <aros/oldprograms.h>
42 USHORT
Invers(inv
,n
,p
)
46 REGISTER DOUBLE
*ptr1
, *ptr2
, *ptr3
, s
;
52 ptr2
= inv
+ ((LONG
)(k
-1)*(LONG
)(n
+1));
55 ptr1
= inv
+ ((LONG
)(i
-1)*(LONG
)n
+(LONG
)(k
-1));
60 if(s
==0.0) return(NOT_INVERTABLE
);
68 if(max
<EPS_INV
) return(NOT_INVERTABLE
);
78 s
= *(inv
+ ((LONG
)(k
-1)*(LONG
)(n
+1)));
79 ptr1
= inv
+ ((LONG
)(k
-1)*(LONG
)n
);
86 if(i
!=k
) *ptr2
+= (*ptr3
)*(*ptr1
);
102 for(k
=n
-1; k
>0; --k
) {
103 if((j
=p
[k
-1]) != k
) {
106 for(i
=1; i
<=n
; ++i
) {
121 /*****************************************************************************
122 * VOID Mult(A,B,erg,n,m,k) *
123 * Zweck : Matrizenmultiplikation erg = A*B *
124 * Input : A - (n,m)-Matrix *
126 * n,m,k - Zeilen- und Spaltenanzahlen *
127 * Output : erg - (n,k)-Matrix A*B *
128 *****************************************************************************/
130 VOID
Mult(A
,B
,erg
,n
,m
,k
)
134 REGISTER DOUBLE
*Aptr
,*Bptr
,s
;
135 REGISTER SHORT h
,j
,i
;
137 for(i
=0; i
<n
; ++i
) { /* Zeilen von erg */
138 for(j
=0; j
<k
; ++j
) { /* Spalten von erg */
141 for(s
=0.0,h
=0; h
<m
; ++h
) {
142 s
+= (*Aptr
++)*(*Bptr
);
155 /*****************************************************************************
156 * DOUBLE M(matrix,n,i,j,flag) *
157 * Zweck : M() liest die Komponente a[i,j] einer Matrix *
158 * Input : matrix - Zeiger auf die Matrix *
159 * n - Anzahl Spalten *
162 * flag - PHASE_I/PHASE_II *
163 * Bemerkung : Falls j>n und flag==PHASE_I, gibt M() Werte der angehängten *
164 * Einheitsmatrix aus (0 oder 1) *
165 *****************************************************************************/
167 DOUBLE
M(matrix
,n
,i
,j
,flag
)
172 if(flag
==PHASE_I
&& j
>n
) return(i
==j
-n
? 1.0 : 0.0);
173 else return(*(matrix
+((LONG
)(i
-1)*(LONG
)n
+(LONG
)(j
-1))));
178 /*****************************************************************************
179 * VOID SetM(matrix,n,i,j,value) *
180 * Zweck : SetM() setzt die Komponente a[i,j] einer Matrix auf 'value' *
181 * Input : matrix - Zeiger auf die Matrix *
182 * n - Anzahl Spalten *
185 * value - a[i,j] = value *
186 *****************************************************************************/
188 VOID
SetM(matrix
,n
,i
,j
,value
)
193 *(matrix
+((LONG
)(i
-1)*(LONG
)n
+(LONG
)(j
-1))) = value
;