/***************************************************************************** * Modul : matrix.c * * Zweck : Funktionen für Matrixinversion, Matrizenmultipli- * * kation und Matrizenzugriff * * Autor : Stefan Förster * * * * Datum | Version | Bemerkung * * -----------|---------|--------------------------------------------------- * * 21.12.1988 | | M() * * | | SetM() * * | | Mult() * * 05.01.1989 | | Invers() * * 18.01.1989 | | Mult() ohne M() und SetM() * * 30.01.1989 | | Invers() ohne Verwendung von LRSubst(),LRPart()) * * | | Bug in M(): Typumwandlung (LONG) wegen Overflow * * | | Bug in SetM(): Typumwandlung (LONG) wegen Overflow * * 06.02.1989 | 0.0 | Invers() ohne M() u. SetM(); Anpassung an ASimplex * * | | Mult() angepaßt an ASimplex * * | | M() angepaßt an ASimplex * * | | SetM() angepaßt an ASimplex * * 02.03.1989 | 0.1 | Bug in M(): if(flag==PHASE_I) statt if(PHASE_I) * * 07.03.1989 | 1.0 | Bug in Invers(): fabs() statt ABS() (Typ SHORT !!) * *****************************************************************************/ /***************************************************************************** * USHORT Invers(inv,n,p) * * Zweck : Berechnung der inversen Matrix mit Hilfe des Gauß-Algorithmus * * Input : inv - Matrix, von der die inverse Matrix berechnet werden * * soll * * n - Größe der (n,n)-Matrix * * Output : inv - inverse Matrix * * p - n-Permutationsvektor * * Ergebnis : INVERTABLE/NOT_INVERTABLE * *****************************************************************************/ USHORT Invers(inv,n,p) DOUBLE *inv; SHORT n,*p; { REGISTER DOUBLE *ptr1, *ptr2, *ptr3, s; REGISTER SHORT i,j,k; REGISTER DOUBLE max; for(k=1; k<=n; ++k) { max = 0.0; ptr2 = inv + ((LONG)(k-1)*(LONG)(n+1)); for(i=k; i<=n; ++i) { s = 0; ptr1 = inv + ((LONG)(i-1)*(LONG)n+(LONG)(k-1)); for(j=k; j<=n; ++j) { s += fabs(*ptr1); ++ptr1; } if(s==0.0) return(NOT_INVERTABLE); s = fabs(*ptr2)/s; ptr2 += n; if(s>max) { max = s; p[k-1] = i; } } if(max0; --k) { if((j=p[k-1]) != k) { ptr1 = inv + (k-1); ptr2 = inv + (j-1); for(i=1; i<=n; ++i) { s = *ptr1; *ptr1 = *ptr2; *ptr2 = s; ptr1 += n; ptr2 += n; } } } return(INVERTABLE); } /***************************************************************************** * VOID Mult(A,B,erg,n,m,k) * * Zweck : Matrizenmultiplikation erg = A*B * * Input : A - (n,m)-Matrix * * B - (m,k)-Matrix * * n,m,k - Zeilen- und Spaltenanzahlen * * Output : erg - (n,k)-Matrix A*B * *****************************************************************************/ VOID Mult(A,B,erg,n,m,k) DOUBLE *A,*B,*erg; SHORT n,m,k; { REGISTER DOUBLE *Aptr,*Bptr,s; REGISTER SHORT h,j,i; for(i=0; in und flag==PHASE_I, gibt M() Werte der angehängten * * Einheitsmatrix aus (0 oder 1) * *****************************************************************************/ DOUBLE M(matrix,n,i,j,flag) DOUBLE *matrix; SHORT n,i,j; USHORT flag; { if(flag==PHASE_I && j>n) return(i==j-n ? 1.0 : 0.0); else return(*(matrix+((LONG)(i-1)*(LONG)n+(LONG)(j-1)))); } /***************************************************************************** * VOID SetM(matrix,n,i,j,value) * * Zweck : SetM() setzt die Komponente a[i,j] einer Matrix auf 'value' * * Input : matrix - Zeiger auf die Matrix * * n - Anzahl Spalten * * i - Zeilenindex * * j - Spaltenindex * * value - a[i,j] = value * *****************************************************************************/ VOID SetM(matrix,n,i,j,value) DOUBLE *matrix; SHORT n,i,j; DOUBLE value; { *(matrix+((LONG)(i-1)*(LONG)n+(LONG)(j-1))) = value; }