root/snippet/image_projection/matrix.c

Revision 85, 3.5 KB (checked in by aqua, 21 months ago)

add console mine project

Line 
1#include <stdio.h>
2#include <stdlib.h>
3
4#include <string.h>
5
6#include "matrix.h"
7
8matrix* matrix_new( int row, int col ){
9        matrix* m;
10        int             i;
11
12        m = (matrix*)malloc(sizeof(matrix));
13
14        m->row = row;
15        m->col = col;
16
17        m->var = (double**)malloc(sizeof(double*)*row);
18        for( i = 0 ; i < row ; i++ ){
19                m->var[i] = (double*)malloc(sizeof(double)*col);
20                memset( m->var[i], 0, sizeof(double)*col );
21        }
22
23        return m;
24}
25
26void matrix_free( matrix* m ){
27
28        int i;
29
30        for( i = 0 ; i < m->row ; i++ ){
31                free(m->var[i]);       
32        }
33        free(m->var);
34        free(m);
35
36}
37
38void matrix_init( matrix* m, double* src ){
39
40        int i, j;
41        int width = m->col;
42       
43        for( j = 0 ; j < m->row ; j++ )
44                for( i = 0 ; i < width ; i++ )
45                        m->var[j][i] = src[j*width+i];
46       
47}
48
49void matrix_extract( double* dst, matrix* m ){
50
51        int i, j;
52        int width = m->col;
53       
54        for( j = 0 ; j < m->row ; j++ )
55                for( i = 0 ; i < width ; i++ )
56                        dst[j*width+i] = m->var[j][i];
57       
58}
59
60void matrix_load_identity( matrix* m ){
61
62        int i, j, iter;
63
64        if( m->col != m->row )
65                return;
66
67        iter = m->col;
68        for( j = 0 ; j < iter ; j++ )
69                for( i = 0 ; i < iter ; i++ )
70                        if( i == j )
71                                m->var[j][i] = 1.0;
72                        else
73                                m->var[j][i] = 0.0;
74
75}
76
77matrix* matrix_transpose( matrix* m ){
78
79        int i, j;
80        matrix* t;
81
82        t = matrix_new( m->col, m->row );
83        for( j = 0 ; j < m->row ; j++ ){
84                for( i = 0 ; i < m->col ; i++ ){
85                        t->var[i][j] = m->var[j][i];
86                }
87        }
88        return t;
89}
90
91matrix* matrix_multiple( matrix* a, matrix* b ){
92
93        matrix* m;
94        int col, row, iter;
95        int i, j, k;
96
97        if( a->col != b->row )
98                return NULL;
99
100        row = a->row;
101        col = b->col;
102
103        iter = a->col;
104
105        m = matrix_new( row, col );
106        for( j = 0 ; j < row ; j++ ){
107                for( i = 0 ; i < col ; i++ ){
108                        for( k = 0 ; k < iter ; k++ ){
109                                m->var[j][i] += a->var[j][k]*b->var[k][i];     
110                        }
111                }
112        }
113        return m;
114
115}
116
117matrix* matrix_inv( matrix* m ){
118
119        matrix *inv, *n;
120        int iter, i, j, k;
121
122        double v;
123
124        double tmp;
125        int    max_key;
126
127        if( m->col != m->row )
128                return NULL;
129
130        iter = m->row;
131        inv = matrix_new( m->row, m->col );
132        n = matrix_new( m->row, m->col*2 );
133
134        // copy it
135        for( j = 0 ; j < iter ; j++ )
136                for( i = 0 ; i < iter ; i++ )
137                        n->var[j][i] = m->var[j][i];
138       
139        // insert identity matrix
140        for( i = 0 ; i < iter ; i++ )
141                n->var[i][i+iter] = 1.0;
142       
143        // start gauss elimination
144        for( i = 0 ; i < iter ; i++ ){
145
146                // find max
147                max_key = i;
148                for( j = i+1 ; j < iter ; j++ )
149                        if( n->var[j][i] > n->var[max_key][i] )
150                                max_key = j;
151               
152                // swap with current row
153                if( max_key != i ){
154                        for( j = 0 ; j < iter*2 ; j++ ){
155                                tmp = n->var[i][j];
156                                n->var[i][j] = n->var[max_key][j];
157                                n->var[max_key][j] = tmp;
158                        }
159                }
160
161                // normalize
162                v = n->var[i][i];
163                for( j = i+1 ; j < iter*2 ; j++ )
164                        n->var[i][j] /= v;
165               
166                for( j = i+1 ; j < iter ; j++ ){
167                        v = n->var[j][i];
168                        n->var[j][i] = 0.0;
169                        for( k = i+1 ; k < iter*2 ; k++ ){
170                                n->var[j][k] -= n->var[i][k]*v;
171                        }
172                }
173
174        }
175        for( i = iter-2 ; i >= 0 ; i-- ){
176
177                for( j = i ; j >= 0 ; j-- ){
178                        v = n->var[j][i+1];
179                        for( k = 0 ; k < iter*2 ; k++ ){
180                                n->var[j][k] -= n->var[i+1][k]*v;
181                        }
182                }
183        }
184
185        // copy it
186        for( j = 0 ; j < iter ; j++ )
187                for( i = 0 ; i < iter ; i++ )
188                        inv->var[j][i] = n->var[j][i+iter];
189
190        matrix_free(n);
191
192        return inv;
193}
194
195
196void matrix_print( matrix* m ){
197
198        int i, j;
199        for( j = 0 ; j < m->row ; j++ ){
200                for( i = 0 ; i < m->col ; i++ ){
201                        fprintf( stdout, "%3.5lf ", m->var[j][i] );
202                }
203                fprintf( stdout, "\n" );
204        }
205        fprintf( stdout, "\n" );
206
207}
Note: See TracBrowser for help on using the browser.