IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
BasicLinearAlgebra.h
Go to the documentation of this file.
1 // BasicLinearAlgebra.h:
3 // ---------------------
4 //
14 
15 #ifndef __IPSDKMATH_BASICLINEARALGEBRA_H__
16 #define __IPSDKMATH_BASICLINEARALGEBRA_H__
17 
21 
22 namespace ipsdk {
23 namespace math {
24 
27 
29 IPSDK_FORCEINLINE ipReal64
30 det(const ipReal64 a11, const ipReal64 a12,
31  const ipReal64 a21, const ipReal64 a22)
32 {
33  return a11*a22 - a12*a21;
34 }
35 
37 IPSDK_FORCEINLINE ipReal64
38 det(const ipReal64 a11, const ipReal64 a12, const ipReal64 a13,
39  const ipReal64 a21, const ipReal64 a22, const ipReal64 a23,
40  const ipReal64 a31, const ipReal64 a32, const ipReal64 a33)
41 {
42  return a11 * (a22*a33 - a23*a32) + a12 * (a23*a31 - a21*a33) + a13 * (a21*a32 - a22*a31);
43 }
44 
48 IPSDK_FORCEINLINE bool
49 solveLinear(const ipReal64 a11, const ipReal64 a12, const ipReal64 b1,
50  const ipReal64 a21, const ipReal64 a22, const ipReal64 b2,
51  ipReal64& x1, ipReal64& x2)
52 {
53  // compute determinant
54  const ipReal64 detA = det(a11, a12, a21, a22);
55  if (detA == 0)
56  return false;
57 
58  // compute solution
59  x1 = det(b1, a12, b2, a22) / detA;
60  x2 = det(a11, b1, a21, b2) / detA;
61 
62  return true;
63 }
64 
68 IPSDK_FORCEINLINE bool
69 solveLinear(const ipReal64 a11, const ipReal64 a12, const ipReal64 a13, const ipReal64 b1,
70  const ipReal64 a21, const ipReal64 a22, const ipReal64 a23, const ipReal64 b2,
71  const ipReal64 a31, const ipReal64 a32, const ipReal64 a33, const ipReal64 b3,
72  ipReal64& x1, ipReal64& x2, ipReal64& x3)
73 {
74  // compute determinant
75  const ipReal64 detA = det(a11, a12, a13, a21, a22, a23, a31, a32, a33);
76  if (detA == 0)
77  return false;
78 
79  // compute solution
80  x1 = det(b1, a12, a13, b2, a22, a23, b3, a32, a33) / detA;
81  x2 = det(a11, b1, a13, a21, b2, a23, a31, b3, a33) / detA;
82  x3 = det(a11, a12, b1, a21, a22, b2, a31, a32, b3) / detA;
83 
84  return true;
85 }
86 
89 IPSDK_FORCEINLINE bool
91  ipReal64& a21, ipReal64& a22)
92 {
93  // compute determinant
94  const ipReal64 detA = det(a11, a12, a21, a22);
95  if (detA == 0)
96  return false;
97 
98  // update matrix inverse
99  a12 = - a12 / detA;
100  a21 = - a21 / detA;
101  const ipReal64 tmp = a11;
102  a11 = a22 / detA;
103  a22 = tmp / detA;
104 
105  return true;
106 }
107 
110 
111 } // end of namespace math
112 } // end of namespace ipsdk
113 
114 #endif // __IPSDKMATH_BASICLINEARALGEBRA_H__
Definition of import/export macro for library.
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
Predefined types for linear algebra management.
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
IPSDK_FORCEINLINE bool invertMatrix(ipReal64 &a11, ipReal64 &a12, ipReal64 &a21, ipReal64 &a22)
inversion of a 2x2 matrix
Definition: BasicLinearAlgebra.h:90
IPSDK_FORCEINLINE ipReal64 det(const ipReal64 a11, const ipReal64 a12, const ipReal64 a21, const ipReal64 a22)
computation of a 2x2 matrix determinant
Definition: BasicLinearAlgebra.h:30
IPSDK_FORCEINLINE bool solveLinear(const ipReal64 a11, const ipReal64 a12, const ipReal64 b1, const ipReal64 a21, const ipReal64 a22, const ipReal64 b2, ipReal64 &x1, ipReal64 &x2)
solve linear system of 2 equations with two unknowns (we solve linear system AX=B) ...
Definition: BasicLinearAlgebra.h:49