Subversion Repositories AndroidProjects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
204 chris 1
/*******************************************************
2
 *
3
 * Author: Shinsaku Hiura, Hirokazu Kato
4
 *
5
 *         shinsaku@sys.es.osaka-u.ac.jp
6
 *         kato@sys.im.hiroshima-cu.ac.jp
7
 *
8
 * Revision: 2.1
9
 * Date: 99/07/16
10
 *
11
*******************************************************/
12
#include <stdio.h>
13
#include <math.h>
14
#include <AR/matrix.h>
15
 
16
static double *minv( double *ap, int dimen, int rowa );
17
 
18
int arMatrixSelfInv(ARMat *m)
19
{
20
        if(minv(m->m, m->row, m->row) == NULL) return -1;
21
 
22
        return 0;
23
}
24
 
25
 
26
/********************************/
27
/*                              */
28
/*    MATRIX inverse function   */
29
/*                              */
30
/********************************/
31
static double *minv( double *ap, int dimen, int rowa )
32
{
33
        double *wap, *wcp, *wbp;/* work pointer                 */
34
        int i,j,n,ip,nwork;
35
        int nos[50];
36
        double epsl;
37
        double p,pbuf,work;
38
        double  fabs();
39
 
40
        epsl = 1.0e-10;         /* Threshold value      */
41
 
42
        switch (dimen) {
43
                case (0): return(NULL);                 /* check size */
44
                case (1): *ap = 1.0 / (*ap);
45
                          return(ap);                   /* 1 dimension */
46
        }
47
 
48
        for(n = 0; n < dimen ; n++)
49
                nos[n] = n;
50
 
51
        for(n = 0; n < dimen ; n++) {
52
                wcp = ap + n * rowa;
53
 
54
                for(i = n, wap = wcp, p = 0.0; i < dimen ; i++, wap += rowa)
55
                        if( p < ( pbuf = fabs(*wap)) ) {
56
                                p = pbuf;
57
                                ip = i;
58
                        }
59
                if (p <= epsl)
60
                        return(NULL);
61
 
62
                nwork = nos[ip];
63
                nos[ip] = nos[n];
64
                nos[n] = nwork;
65
 
66
                for(j = 0, wap = ap + ip * rowa, wbp = wcp; j < dimen ; j++) {
67
                        work = *wap;
68
                        *wap++ = *wbp;
69
                        *wbp++ = work;
70
                }
71
 
72
                for(j = 1, wap = wcp, work = *wcp; j < dimen ; j++, wap++)
73
                        *wap = *(wap + 1) / work;
74
                *wap = 1.0 / work;
75
 
76
                for(i = 0; i < dimen ; i++) {
77
                        if(i != n) {
78
                                wap = ap + i * rowa;
79
                                for(j = 1, wbp = wcp, work = *wap;
80
                                                j < dimen ; j++, wap++, wbp++)
81
                                        *wap = *(wap + 1) - work * (*wbp);
82
                                *wap = -work * (*wbp);
83
                        }
84
                }
85
        }
86
 
87
        for(n = 0; n < dimen ; n++) {
88
                for(j = n; j < dimen ; j++)
89
                        if( nos[j] == n) break;
90
                nos[j] = nos[n];
91
                for(i = 0, wap = ap + j, wbp = ap + n; i < dimen ;
92
                                        i++, wap += rowa, wbp += rowa) {
93
                        work = *wap;
94
                        *wap = *wbp;
95
                        *wbp = work;
96
                }
97
        }
98
        return(ap);
99
}