1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
/* $Id: matinv.c,v 1.1.1.1 2004/12/23 04:05:13 ellson Exp $ $Revision: 1.1.1.1 $ */
/* vim:set shiftwidth=4 ts=8: */
/**********************************************************
* This software is part of the graphviz package *
* http://www.graphviz.org/ *
* *
* Copyright (c) 1994-2004 AT&T Corp. *
* and is licensed under the *
* Common Public License, Version 1.0 *
* by AT&T Corp. *
* *
* Information and Software Systems Research *
* AT&T Research, Florham Park NJ *
**********************************************************/
/*
* This code was (mostly) written by Ken Turkowski, who said:
*
* Oh, that. I wrote it in college the first time. It's open source - I think I
* posted it after seeing so many people solve equations by inverting matrices
* by computing minors naïvely.
* -Ken
*
* The views represented here are mine and are not necessarily shared by
* my employer.
Ken Turkowski turk@apple.com
Immersive Media Technologist http://www.worldserver.com/turk/
Apple Computer, Inc.
1 Infinite Loop, MS 302-3VR
Cupertino, CA 95014
*/
/* Matinv() inverts the matrix A using LU decomposition. Arguments:
* A - the (n x n) matrix to be inverted
* Ainv - the (n x n) inverted matrix
* n - the order of the matrices A and Ainv
*/
#if _PACKAGE_ast
#include <ast.h>
#else
#endif
#include <stdlib.h>
#include <render.h>
extern int lu_decompose(double **a, int n);
extern void lu_solve(double *x, double *b, int n);
int matinv(double **A, double **Ainv, int n)
{
register int i, j;
double *b, temp;
/* Decompose matrix into L and U triangular matrices */
if (lu_decompose(A, n) == 0)
return (0); /* Singular */
/* Invert matrix by solving n simultaneous equations n times */
b = N_NEW(n, double);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
b[j] = 0.0;
b[i] = 1.0;
lu_solve(Ainv[i], b, n); /* Into a row of Ainv: fix later */
}
free(b);
/* Transpose matrix */
for (i = 0; i < n; i++) {
for (j = 0; j < i; j++) {
temp = Ainv[i][j];
Ainv[i][j] = Ainv[j][i];
Ainv[j][i] = temp;
}
}
return (1);
}
|