IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
LinearAlgebraUtils.h
Go to the documentation of this file.
1 // LinearAlgebraUtils.h:
3 // ---------------------
4 //
14 
15 #ifndef __IPSDKMATH_LINEARALGEBRAUTILS_H__
16 #define __IPSDKMATH_LINEARALGEBRAUTILS_H__
17 
20 #include <IPSDKMath/Constants.h>
22 #include <vector>
23 
24 namespace ipsdk {
25 namespace math {
26 
29 
32 IPSDK_FORCEINLINE ipReal64
34  const ipsdk::math::Vector& v1)
35 {
36  // parse all elements
37  ipReal64 dist = 0;
38  Vector::const_iterator iter0 = v0.begin();
39  Vector::const_iterator iter1 = v1.begin();
40  while (iter0 != v0.end()) {
41 
42  // retrieve current elements
43  const ipReal64 curValue0 = *iter0;
44  const ipReal64 curValue1 = *iter1;
45 
46  // compute contribution to comparable distance
47  const ipReal64 delta = curValue0 - curValue1;
48  dist += delta*delta;
49 
50  ++iter0;
51  ++iter1;
52  }
53 
54  return dist;
55 }
56 
59 IPSDK_FORCEINLINE ipReal64
61  const ipsdk::math::Vector& v1)
62 {
63  return std::sqrt(comparable_distance(v0, v1));
64 }
65 
68 template <typename ArrayType>
69 std::vector<ipReal64>
70 fromUBlas(const boost::numeric::ublas::vector<ipReal64, ArrayType>& inputVector)
71 {
72  std::vector<ipReal64> outputVector;
73  fromUBlas(inputVector, outputVector);
74 
75  return outputVector;
76 }
77 template <typename ArrayType>
78 void
79 fromUBlas(const boost::numeric::ublas::vector<ipReal64, ArrayType>& inputVector,
80  std::vector<ipReal64>& outputVector)
81 {
82  outputVector.clear();
83  outputVector.reserve(inputVector.size());
84  boost::numeric::ublas::vector<ipReal64>::const_iterator iter = inputVector.begin();
85  while (iter != inputVector.end()) {
86 
87  outputVector.push_back(*iter);
88 
89  ++iter;
90  }
91 }
93 toUBlas(const std::vector<ipReal64>& inputVector);
94 IPSDKMATH_API void
95 toUBlas(const std::vector<ipReal64>& inputVector,
96  ipsdk::math::Vector& outputVector);
98 
101 template <typename ArrayType>
102 std::vector<ipReal64>
103 fromUBlas(const boost::numeric::ublas::matrix<ipReal64, boost::numeric::ublas::row_major, ArrayType>& inputMatrix)
104 {
105  std::vector<ipReal64> outputVector;
106  fromUBlas(inputMatrix, outputVector);
107 
108  return outputVector;
109 }
110 template <typename ArrayType>
111 void
112 fromUBlas(const boost::numeric::ublas::matrix<ipReal64, boost::numeric::ublas::row_major, ArrayType>& inputMatrix,
113  std::vector<ipReal64>& outputVector)
114 {
115  outputVector.clear();
116  outputVector.reserve(inputMatrix.data().size());
117  boost::numeric::ublas::vector<ipReal64>::const_iterator iter = inputMatrix.data().begin();
118  while (iter != inputMatrix.data().end()) {
119 
120  outputVector.push_back(*iter);
121 
122  ++iter;
123  }
124 }
126 toUBlas(const std::vector<ipReal64>& inputVector,
127  const ipUInt32 sizeX,
128  const ipUInt32 sizeY);
129 IPSDKMATH_API void
130 toUBlas(const std::vector<ipReal64>& inputVector,
131  ipsdk::math::Matrix& outputMatrix);
133 
135 template <typename ArrayType1, typename ArrayType2>
136 bool
137 equal(const boost::numeric::ublas::matrix<ipReal64, boost::numeric::ublas::row_major, ArrayType1>& mat1,
138  const boost::numeric::ublas::matrix<ipReal64, boost::numeric::ublas::row_major, ArrayType2>& mat2)
139 {
140  const ipReal64 normDiff = boost::numeric::ublas::norm_frobenius(mat1 - mat2);
141 
142  return normDiff == 0;
143 }
144 
146 template <typename ArrayType1, typename ArrayType2>
147 bool
148 compare(const boost::numeric::ublas::matrix<ipReal64, boost::numeric::ublas::row_major, ArrayType1>& mat1,
149  const boost::numeric::ublas::matrix<ipReal64, boost::numeric::ublas::row_major, ArrayType2>& mat2,
150  const ipReal64 epsilonValue = NumericLimits<ipReal64>::sqrt_epsilon())
151 {
152  const ipReal64 normDiff = boost::numeric::ublas::norm_frobenius(mat1 - mat2);
153 
154  return normDiff < epsilonValue;
155 }
156 
159 template <typename ArrayType1, typename ArrayType2>
160 bool
161 compareRelative(const boost::numeric::ublas::matrix<ipReal64, boost::numeric::ublas::row_major, ArrayType1>& mat1,
162  const boost::numeric::ublas::matrix<ipReal64, boost::numeric::ublas::row_major, ArrayType2>& mat2,
163  const ipReal64 epsilonValue = NumericLimits<ipReal64>::sqrt_epsilon())
164 {
165  const ipReal64 norm1 = boost::numeric::ublas::norm_frobenius(mat1);
166  const ipReal64 norm2 = boost::numeric::ublas::norm_frobenius(mat2);
167  const ipReal64 normDiff = boost::numeric::ublas::norm_frobenius(mat1 - mat2);
168 
169  return normDiff < epsilonValue * std::max(norm1, norm2);
170 }
171 
173 template <typename ArrayType1, typename ArrayType2>
174 bool
175 equal(const boost::numeric::ublas::vector<ipReal64, ArrayType1>& vec1,
176  const boost::numeric::ublas::vector<ipReal64, ArrayType2>& vec2)
177 {
178  const ipReal64 normDiff = boost::numeric::ublas::norm_2(vec1 - vec2);
179 
180  return normDiff == 0;
181 }
182 
184 template <typename ArrayType1, typename ArrayType2>
185 bool
186 compare(const boost::numeric::ublas::vector<ipReal64, ArrayType1>& vec1,
187  const boost::numeric::ublas::vector<ipReal64, ArrayType2>& vec2,
188  const ipReal64 epsilonValue = NumericLimits<ipReal64>::sqrt_epsilon())
189 {
190  const ipReal64 normDiff = boost::numeric::ublas::norm_2(vec1 - vec2);
191 
192  return normDiff < epsilonValue;
193 }
194 
197 template <typename ArrayType1, typename ArrayType2>
198 bool
199 compareRelative(const boost::numeric::ublas::vector<ipReal64, ArrayType1>& vec1,
200  const boost::numeric::ublas::vector<ipReal64, ArrayType2>& vec2,
201  const ipReal64 epsilonValue = NumericLimits<ipReal64>::sqrt_epsilon())
202 {
203  const ipReal64 norm1 = boost::numeric::ublas::norm_2(vec1);
204  const ipReal64 norm2 = boost::numeric::ublas::norm_2(vec2);
205  const ipReal64 normDiff = boost::numeric::ublas::norm_2(vec1 - vec2);
206 
207  return normDiff < epsilonValue * std::max(norm1, norm2);
208 }
209 
212 
213 } // end of namespace math
214 } // end of namespace ipsdk
215 
216 #endif // __IPSDKMATH_LINEARALGEBRAUTILS_H__
Definition of import/export macro for library.
boost::numeric::ublas::matrix< ipReal64 > Matrix
matrix type associated to library
Definition: LinearAlgebraTypes.h:48
Defines the IPSDK_FORCEINLINE.
bool compare(const boost::numeric::ublas::matrix< ipReal64, boost::numeric::ublas::row_major, ArrayType1 > &mat1, const boost::numeric::ublas::matrix< ipReal64, boost::numeric::ublas::row_major, ArrayType2 > &mat2, const ipReal64 epsilonValue=NumericLimits< ipReal64 >::sqrt_epsilon())
matrix comparison with tolerance on frobenius norm of difference
Definition: LinearAlgebraUtils.h:148
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
Predefined types for linear algebra management.
IPSDK_FORCEINLINE PackT sqrt(const PackT &in)
returns the square root of a pack
Definition: sqrt.h:40
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
Definition: NumericLimits.h:27
Predefined constants for ipsdk math library.
IPSDK_FORCEINLINE PackT max(const PackT &in1, const PackT &in2)
returns the maximum of 2 packs
Definition: max.h:40
boost::numeric::ublas::vector< ipReal64 > Vector
vector type associated to library
Definition: LinearAlgebraTypes.h:36
#define IPSDKMATH_API
Import/Export macro for library IPSDKMath.
Definition: IPSDKMathExports.h:27
bool compareRelative(const boost::numeric::ublas::matrix< ipReal64, boost::numeric::ublas::row_major, ArrayType1 > &mat1, const boost::numeric::ublas::matrix< ipReal64, boost::numeric::ublas::row_major, ArrayType2 > &mat2, const ipReal64 epsilonValue=NumericLimits< ipReal64 >::sqrt_epsilon())
Definition: LinearAlgebraUtils.h:161
IPSDKMATH_API ipsdk::math::Vector toUBlas(const std::vector< ipReal64 > &inputVector)
convert a math Vector from and to an std vector
std::vector< ipReal64 > fromUBlas(const boost::numeric::ublas::vector< ipReal64, ArrayType > &inputVector)
convert a math Vector from and to an std vector
Definition: LinearAlgebraUtils.h:70
bool equal(const boost::numeric::ublas::matrix< ipReal64, boost::numeric::ublas::row_major, ArrayType1 > &mat1, const boost::numeric::ublas::matrix< ipReal64, boost::numeric::ublas::row_major, ArrayType2 > &mat2)
check for matrix equality
Definition: LinearAlgebraUtils.h:137
IPSDK_FORCEINLINE ipReal64 euclidian_distance(const ipsdk::math::Vector &v0, const ipsdk::math::Vector &v1)
function allowing to compute euclidian distance between two vectors
Definition: LinearAlgebraUtils.h:60
IPSDK_FORCEINLINE ipReal64 comparable_distance(const ipsdk::math::Vector &v0, const ipsdk::math::Vector &v1)
function allowing to compute comparable distance between two vectors
Definition: LinearAlgebraUtils.h:33
uint32_t ipUInt32
Base types definition.
Definition: BaseTypes.h:53