/
det.c
96 lines (79 loc) · 1.82 KB
/
det.c
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include "vectors.c"
double det(_MATRIX);
int usage(){
printf("determinant Utility\n");
return 1;
}
int main(int argc, char** argv){
FILE* in;
_MATRIX mx;
if(argc>1){
if(argv[1][0]=='-'){
exit(usage());
}
else{
in=fopen(argv[1],"r");
}
}
else{
in=stdin;
}
if(!in){
printf("Could not open.");
exit(9003);
}
if(readmatrix(in,&mx)!=ERR_OK){
fclose(in);
printf("Error.");
exit(90012);
}
if(mx.header.height != mx.header.width){
printf("Not a quadratic matrix.");
exit(2013);
}
printf("%0.3lf\n", det(mx));
fclose(in);
freematrix(&mx);
return 0;
}
double det(_MATRIX mx) {
if (mx.header.height == 2) {
return mx.data[0][0] * mx.data[1][1] - mx.data[0][1] * mx.data[1][0];
}
if (mx.header.height == 1) {
return mx.data[0][0];
}
unsigned long i, j, k, m, n;
double determinant = 0;
_MATRIX new_mx;
memcpy(new_mx.header.sig,MATRIX_MAGIC,8);
new_mx.header.height = mx.header.height - 1;
new_mx.header.width = mx.header.width - 1;
initmatrix(&new_mx);
for (i = 0; i < mx.header.height; i++) { // traverse every row mx.data[i][*]
m = 0;
for (j = 0; j < mx.header.height; j++) { // traverse new row of new_mx
n = 0;
for (k = 1; k < mx.header.width; k++) { // traverse element of row
if (j != i) {
new_mx.data[m][n] = mx.data[j][k];
n++;
}
}
if (n > 0) {
m++;
}
}
if (i % 2 == 0) {
determinant += mx.data[i][0] * det(new_mx);
} else {
determinant -= mx.data[i][0] * det(new_mx);
}
}
freematrix(&new_mx);
return determinant;
}