Coverage Report

Created: 2025-07-11 06:47

/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