diff options
author | Eric Andersen <andersen@codepoet.org> | 2001-05-10 00:40:28 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2001-05-10 00:40:28 +0000 |
commit | 1077fa4d772832f77a677ce7fb7c2d513b959e3f (patch) | |
tree | 579bee13fb0b58d2800206366ec2caecbb15f3fc /libm/double/minv.c | |
parent | 22358dd7ce7bb49792204b698f01a6f69b9c8e08 (diff) |
uClibc now has a math library. muahahahaha!
-Erik
Diffstat (limited to 'libm/double/minv.c')
-rw-r--r-- | libm/double/minv.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/libm/double/minv.c b/libm/double/minv.c new file mode 100644 index 000000000..df788fecf --- /dev/null +++ b/libm/double/minv.c @@ -0,0 +1,61 @@ +/* minv.c + * + * Matrix inversion + * + * + * + * SYNOPSIS: + * + * int n, errcod; + * double A[n*n], X[n*n]; + * double B[n]; + * int IPS[n]; + * int minv(); + * + * errcod = minv( A, X, n, B, IPS ); + * + * + * + * DESCRIPTION: + * + * Finds the inverse of the n by n matrix A. The result goes + * to X. B and IPS are scratch pad arrays of length n. + * The contents of matrix A are destroyed. + * + * The routine returns nonzero on error; error messages are printed + * by subroutine simq(). + * + */ + +minv( A, X, n, B, IPS ) +double A[], X[]; +int n; +double B[]; +int IPS[]; +{ +double *pX; +int i, j, k; + +for( i=1; i<n; i++ ) + B[i] = 0.0; +B[0] = 1.0; +/* Reduce the matrix and solve for first right hand side vector */ +pX = X; +k = simq( A, B, pX, n, 1, IPS ); +if( k ) + return(-1); +/* Solve for the remaining right hand side vectors */ +for( i=1; i<n; i++ ) + { + B[i-1] = 0.0; + B[i] = 1.0; + pX += n; + k = simq( A, B, pX, n, -1, IPS ); + if( k ) + return(-1); + } +/* Transpose the array of solution vectors */ +mtransp( n, X, X ); +return(0); +} + |