/src/gpsd/gpsd-3.26.2~dev/gpsd/matrix.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* matrix.c - matrix-algebra code |
2 | | * |
3 | | * This file is Copyright by the GPSD project |
4 | | * SPDX-License-Identifier: BSD-2-clause |
5 | | */ |
6 | | |
7 | | #include "../include/gpsd_config.h" // must be before all includes |
8 | | |
9 | | #include <math.h> |
10 | | #include <stdbool.h> |
11 | | |
12 | | #include "../include/matrix.h" |
13 | | |
14 | | // selected elements from 4x4 matrox inversion |
15 | | bool matrix_invert(double mat[4][4], double inverse[4][4]) |
16 | 0 | { |
17 | | // Find all NECESSARY 2x2 subdeterminants |
18 | 0 | double Det2_12_01 = mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]; |
19 | 0 | double Det2_12_02 = mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]; |
20 | | //double Det2_12_03 = mat[1][0]*mat[2][3] - mat[1][3]*mat[2][0]; |
21 | 0 | double Det2_12_12 = mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]; |
22 | | //double Det2_12_13 = mat[1][1]*mat[2][3] - mat[1][3]*mat[2][1]; |
23 | | //double Det2_12_23 = mat[1][2]*mat[2][3] - mat[1][3]*mat[2][2]; |
24 | 0 | double Det2_13_01 = mat[1][0] * mat[3][1] - mat[1][1] * mat[3][0]; |
25 | | //double Det2_13_02 = mat[1][0]*mat[3][2] - mat[1][2]*mat[3][0]; |
26 | 0 | double Det2_13_03 = mat[1][0] * mat[3][3] - mat[1][3] * mat[3][0]; |
27 | | //double Det2_13_12 = mat[1][1]*mat[3][2] - mat[1][2]*mat[3][1]; |
28 | 0 | double Det2_13_13 = mat[1][1] * mat[3][3] - mat[1][3] * mat[3][1]; |
29 | | //double Det2_13_23 = mat[1][2]*mat[3][3] - mat[1][3]*mat[3][2]; |
30 | 0 | double Det2_23_01 = mat[2][0] * mat[3][1] - mat[2][1] * mat[3][0]; |
31 | 0 | double Det2_23_02 = mat[2][0] * mat[3][2] - mat[2][2] * mat[3][0]; |
32 | 0 | double Det2_23_03 = mat[2][0] * mat[3][3] - mat[2][3] * mat[3][0]; |
33 | 0 | double Det2_23_12 = mat[2][1] * mat[3][2] - mat[2][2] * mat[3][1]; |
34 | 0 | double Det2_23_13 = mat[2][1] * mat[3][3] - mat[2][3] * mat[3][1]; |
35 | 0 | double Det2_23_23 = mat[2][2] * mat[3][3] - mat[2][3] * mat[3][2]; |
36 | | |
37 | | // Find all NECESSARY 3x3 subdeterminants |
38 | 0 | double Det3_012_012 = mat[0][0] * Det2_12_12 - mat[0][1] * Det2_12_02 + |
39 | 0 | mat[0][2] * Det2_12_01; |
40 | | //double Det3_012_013 = mat[0][0]*Det2_12_13 - mat[0][1]*Det2_12_03 |
41 | | // + mat[0][3]*Det2_12_01; |
42 | | //double Det3_012_023 = mat[0][0]*Det2_12_23 - mat[0][2]*Det2_12_03 |
43 | | // + mat[0][3]*Det2_12_02; |
44 | | //double Det3_012_123 = mat[0][1]*Det2_12_23 - mat[0][2]*Det2_12_13 |
45 | | // + mat[0][3]*Det2_12_12; |
46 | | //double Det3_013_012 = mat[0][0]*Det2_13_12 - mat[0][1]*Det2_13_02 |
47 | | // + mat[0][2]*Det2_13_01; |
48 | 0 | double Det3_013_013 = mat[0][0] * Det2_13_13 - mat[0][1] * Det2_13_03 + |
49 | 0 | mat[0][3] * Det2_13_01; |
50 | | //double Det3_013_023 = mat[0][0]*Det2_13_23 - mat[0][2]*Det2_13_03 |
51 | | // + mat[0][3]*Det2_13_02; |
52 | | //double Det3_013_123 = mat[0][1]*Det2_13_23 - mat[0][2]*Det2_13_13 |
53 | | // + mat[0][3]*Det2_13_12; |
54 | | //double Det3_023_012 = mat[0][0]*Det2_23_12 - mat[0][1]*Det2_23_02 |
55 | | // + mat[0][2]*Det2_23_01; |
56 | | //double Det3_023_013 = mat[0][0]*Det2_23_13 - mat[0][1]*Det2_23_03 |
57 | | // + mat[0][3]*Det2_23_01; |
58 | 0 | double Det3_023_023 = mat[0][0] * Det2_23_23 - mat[0][2] * Det2_23_03 + |
59 | 0 | mat[0][3] * Det2_23_02; |
60 | | //double Det3_023_123 = mat[0][1]*Det2_23_23 - mat[0][2]*Det2_23_13 |
61 | | // + mat[0][3]*Det2_23_12; |
62 | 0 | double Det3_123_012 = mat[1][0] * Det2_23_12 - mat[1][1] * Det2_23_02 + |
63 | 0 | mat[1][2] * Det2_23_01; |
64 | 0 | double Det3_123_013 = mat[1][0] * Det2_23_13 - mat[1][1] * Det2_23_03 + |
65 | 0 | mat[1][3] * Det2_23_01; |
66 | 0 | double Det3_123_023 = mat[1][0] * Det2_23_23 - mat[1][2] * Det2_23_03 + |
67 | 0 | mat[1][3] * Det2_23_02; |
68 | 0 | double Det3_123_123 = mat[1][1] * Det2_23_23 - mat[1][2] * Det2_23_13 + |
69 | 0 | mat[1][3] * Det2_23_12; |
70 | | |
71 | | // Find the 4x4 determinant |
72 | 0 | static double det; |
73 | 0 | det = mat[0][0] * Det3_123_123 - |
74 | 0 | mat[0][1] * Det3_123_023 + |
75 | 0 | mat[0][2] * Det3_123_013 - |
76 | 0 | mat[0][3] * Det3_123_012; |
77 | | |
78 | | // Very small determinants probably reflect floating-point fuzz near zero |
79 | 0 | if (0.0001 > fabs(det)) { |
80 | 0 | return false; |
81 | 0 | } |
82 | | |
83 | 0 | inverse[0][0] = Det3_123_123 / det; |
84 | | //inverse[0][1] = -Det3_023_123 / det; |
85 | | //inverse[0][2] = Det3_013_123 / det; |
86 | | //inverse[0][3] = -Det3_012_123 / det; |
87 | | |
88 | | //inverse[1][0] = -Det3_123_023 / det; |
89 | 0 | inverse[1][1] = Det3_023_023 / det; |
90 | | //inverse[1][2] = -Det3_013_023 / det; |
91 | | //inverse[1][3] = Det3_012_023 / det; |
92 | | |
93 | | //inverse[2][0] = Det3_123_013 / det; |
94 | | //inverse[2][1] = -Det3_023_013 / det; |
95 | 0 | inverse[2][2] = Det3_013_013 / det; |
96 | | //inverse[2][3] = -Det3_012_013 / det; |
97 | | |
98 | | //inverse[3][0] = -Det3_123_012 / det; |
99 | | //inverse[3][1] = Det3_023_012 / det; |
100 | | //inverse[3][2] = -Det3_013_012 / det; |
101 | 0 | inverse[3][3] = Det3_012_012 / det; |
102 | |
|
103 | 0 | return true; |
104 | 0 | } |
105 | | |
106 | | #ifdef __UNUSED_ |
107 | | // cppcheck-suppress unusedFunction |
108 | | |
109 | | // symmetrize a matrix, multiply it by its transpose |
110 | | void matrix_symmetrize(double mat[4][4], double prod[4][4]) |
111 | | { |
112 | | int i, j, k; |
113 | | |
114 | | for (i = 0; i < 4; ++i) { //< rows |
115 | | for (j = 0; j < 4; ++j) { //< cols |
116 | | prod[i][j] = 0.0; |
117 | | for (k = 0; k < 4; ++k) { |
118 | | prod[i][j] += mat[k][i] * mat[k][j]; |
119 | | } |
120 | | } |
121 | | } |
122 | | } |
123 | | #endif // UNUSED |
124 | | |
125 | | // vim: set expandtab shiftwidth=4 |