SourceXtractorPlusPlus  0.10
Please provide a description of the project.
Mat22.h
Go to the documentation of this file.
1 /*
2  * Mat22.h
3  *
4  * Created on: Jul 25, 2019
5  * Author: mschefer
6  */
7 
8 #ifndef _SEUTILS_MAT22_H_
9 #define _SEUTILS_MAT22_H_
10 
11 #include <tuple>
12 #include <assert.h>
13 
14 namespace SExtractor {
15 
16 class Mat22;
17 Mat22 operator*(const Mat22& a, const Mat22& b);
18 
19 class Mat22 {
20 public:
21 
22  Mat22() : m_mat { 1.0, 0.0, 0.0, 1.0 } {
23  }
24 
25  Mat22(double m1, double m2, double m3, double m4) : m_mat { m1, m2, m3, m4 } {
26  }
27 
29  std::get<0>(tuple),
30  std::get<1>(tuple),
31  std::get<2>(tuple),
32  std::get<3>(tuple)} {}
33 
34  Mat22& operator=(const Mat22& other) {
35  m_mat[0] = other[0];
36  m_mat[1] = other[1];
37  m_mat[2] = other[2];
38  m_mat[3] = other[3];
39 
40  return *this;
41  }
42 
43  double operator[](size_t i) const {
44  return m_mat[i];
45  }
46 
47  double& operator[](size_t i) {
48  return m_mat[i];
49  }
50 
51  Mat22& operator*=(const Mat22& other) {
52  *this = *this * other;
53  return *this;
54  }
55 
56  Mat22 GetInverse() const {
57  Mat22 out;
58 
59  double inv_det = 1. / (m_mat[0] * m_mat[3] - m_mat[2] * m_mat[1]);
60  out[0] = m_mat[3] * inv_det; out[1] = -m_mat[1] * inv_det;
61  out[2] = -m_mat[2] * inv_det; out[3] = m_mat[0] * inv_det;
62 
63  assert(m_mat[0] * out[0] + m_mat[1] * out[2] >= 1 - 1e-8);
64  assert(m_mat[0] * out[1] + m_mat[1] * out[3] <= 1e-8);
65  assert(m_mat[2] * out[0] + m_mat[3] * out[2] <= 1e-8);
66  assert(m_mat[2] * out[1] + m_mat[3] * out[3] >= 1 - 1e-8);
67 
68  return out;
69  }
70 
71  Mat22 GetTranspose() const {
72  Mat22 out { m_mat[0], m_mat[2],
73  m_mat[1], m_mat[3] };
74 
75  return out;
76  }
77 
78  double m_mat[4];
79 };
80 
81 inline Mat22 operator*(const Mat22& a, const Mat22& b) {
82  Mat22 out;
83 
84  out[0] = a[0] * b[0] + a[1] * b[2];
85  out[1] = a[0] * b[1] + a[1] * b[3];
86  out[2] = a[2] * b[0] + a[3] * b[2];
87  out[3] = a[2] * b[1] + a[3] * b[3];
88 
89  return out;
90 }
91 
92 inline Mat22 operator*(const Mat22& a, double b) {
93  Mat22 out;
94 
95  out[0] = a[0] * b;
96  out[1] = a[1] * b;
97  out[2] = a[2] * b;
98  out[3] = a[3] * b;
99 
100  return out;
101 }
102 
103 }
104 
105 
106 #endif /* _SEUTILS_MAT22_H_ */
Mat22 GetTranspose() const
Definition: Mat22.h:71
Mat22(std::tuple< double, double, double, double > tuple)
Definition: Mat22.h:28
double m_mat[4]
Definition: Mat22.h:78
constexpr double e
constexpr double m2
constexpr double m3
double operator[](size_t i) const
Definition: Mat22.h:43
Mat22(double m1, double m2, double m3, double m4)
Definition: Mat22.h:25
double & operator[](size_t i)
Definition: Mat22.h:47
Mat22 operator*(const Mat22 &a, const Mat22 &b)
Definition: Mat22.h:81
Mat22 & operator*=(const Mat22 &other)
Definition: Mat22.h:51
Mat22 & operator=(const Mat22 &other)
Definition: Mat22.h:34
Mat22 GetInverse() const
Definition: Mat22.h:56