Image Component Library (ICL)
EigenICLConverter.h
Go to the documentation of this file.
1 
2 #pragma once
3 
4 #ifdef ICL_HAVE_EIGEN3
5 
6 #include <ICLMath/FixedMatrix.h>
7 #include <ICLMath/FixedVector.h>
8 #include <ICLMath/DynMatrix.h>
9 #include <ICLMath/DynVector.h>
10 #include <Eigen/Core>
11 
12 namespace icl {
13  namespace math {
14 
15  //------------------------------------------------------------------------------------------
16 
17  template<typename T, int COLS, int ROWS> // need ints here. otherwise template parameter cannot be deduced
18  inline icl::math::FixedMatrix<T,COLS,ROWS> eigenToICL(Eigen::Matrix<T,ROWS,COLS> const &E) {
20  for(unsigned int i = 0; i < COLS; ++i)
21  for(unsigned int k = 0; k < ROWS; ++k)
22  result(i,k) = E(k,i);
23  return result;
24  }
25 
26  template<typename T, unsigned int COLS, unsigned int ROWS>
27  inline Eigen::Matrix<T,ROWS,COLS> iclToEigen(icl::math::FixedMatrix<T,COLS,ROWS> const &ICL) {
28  Eigen::Matrix<T,ROWS,COLS> result;
29  for(unsigned int i = 0; i < COLS; ++i)
30  for(unsigned int k = 0; k < ROWS; ++k)
31  result(k,i) = ICL(i,k);
32  return result;
33  }
34 
35  //------------------------------------------------------------------------------------------
36 
37  template<typename T, unsigned int COLS, unsigned int ROWS>
38  inline Eigen::Map<Eigen::Matrix<T,ROWS,COLS,Eigen::RowMajor>,Eigen::Aligned,Eigen::Stride<0,0> >
39  iclToEigenRowMajorShallow(icl::math::FixedMatrix<T,COLS,ROWS> &ICL) {
40  Eigen::Map<Eigen::Matrix<T,ROWS,COLS,Eigen::RowMajor>,Eigen::Aligned,Eigen::Stride<0,0> > result(ICL.data());
41  return result;
42  }
43 
44  template<typename T, unsigned int COLS, unsigned int ROWS>
45  inline Eigen::Map<Eigen::Matrix<T,ROWS,COLS,Eigen::ColMajor>,Eigen::Unaligned,Eigen::Stride<1,COLS> >
46  iclToEigenColMajorShallow(icl::math::FixedMatrix<T,COLS,ROWS> &ICL) {
47  Eigen::Map<Eigen::Matrix<T,ROWS,COLS,Eigen::ColMajor>,Eigen::Unaligned,Eigen::Stride<1,COLS> > result(ICL.data());
48  return result;
49  }
50 
51  //------------------------------------------------------------------------------------------
52 
53  template<typename T>
54  inline icl::math::DynMatrix<T> eigenToICLDyn(Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> const &E) {
55  icl::math::DynMatrix<T> result(E.cols(),E.rows());
56  for(uint i = 0; i < E.cols(); ++i)
57  for(uint k = 0; k < E.rows(); ++k)
58  result(i,k) = E(k,i);
59  return result;
60  }
61 
62  template<typename T>
63  inline Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> iclToEigenDyn(icl::math::DynMatrix<T> const &E) {
64  Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic> result(E.rows(),E.cols());
65  for(uint i = 0; i < E.cols(); ++i)
66  for(uint k = 0; k < E.rows(); ++k)
67  result(k,i) = E(i,k);
68  return result;
69  }
70 
71  //------------------------------------------------------------------------------------------
72 
73  template<typename T>
74  inline Eigen::Map<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor>,Eigen::Aligned >
75  iclToEigenDynRowMajorShallow(icl::math::DynMatrix<T> &ICL) {
76  Eigen::Map<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor>,Eigen::Aligned> result(ICL.data(),ICL.rows(),ICL.cols());
77  return result;
78  }
79 
80  template<typename T>
81  inline Eigen::Map<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::ColMajor>,Eigen::Unaligned,Eigen::Stride<Eigen::Dynamic,Eigen::Dynamic> >
82  iclToEigenDynColMajorShallow(icl::math::DynMatrix<T> &ICL) {
83  Eigen::Map<Eigen::Matrix<T,Eigen::Dynamic,Eigen::Dynamic,Eigen::ColMajor>,Eigen::Unaligned,Eigen::Stride<Eigen::Dynamic,Eigen::Dynamic> > result(ICL.data(),ICL.rows(),ICL.cols(),Eigen::Stride<Eigen::Dynamic,Eigen::Dynamic>(1,ICL.cols()));
84  return result;
85  }
86 
87  //------------------------------------------------------------------------------------------
88 
89  #define ICL_INSTANCIATE_ICL_TO_EIGEN(Type,Size) \
90  template Eigen::Matrix<Type,Size,Size> iclToEigen<Type,Size,Size>(icl::math::FixedMatrix<Type,Size,Size> const &);\
91  template Eigen::Matrix<Type,Size,1> iclToEigen<Type,1,Size>(icl::math::FixedMatrix<Type,1,Size> const &);\
92  template Eigen::Matrix<Type,1,Size> iclToEigen<Type,Size,1>(icl::math::FixedMatrix<Type,Size,1> const &);\
93  template icl::math::FixedMatrix<Type,Size,Size> eigenToICL<Type,Size,Size>(Eigen::Matrix<Type,Size,Size> const &);\
94  template icl::math::FixedMatrix<Type,1,Size> eigenToICL<Type,1,Size>(Eigen::Matrix<Type,Size,1> const &);\
95  template icl::math::FixedMatrix<Type,Size,1> eigenToICL<Type,Size,1>(Eigen::Matrix<Type,1,Size> const &);
96 
97  #define ICL_INSTANCIATE_ICL_TO_EIGEN_DYN(Type) \
98  template icl::math::DynMatrix<Type> eigenToICLDyn<Type>(Eigen::Matrix<Type,Eigen::Dynamic,Eigen::Dynamic> const &); \
99  template Eigen::Matrix<Type,Eigen::Dynamic,Eigen::Dynamic> iclToEigenDyn<Type>(icl::math::DynMatrix<Type> const &);
100 
101  //template Eigen::Map<Eigen::Matrix<Type,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor>> iclToEigenDynShallow<Type>(icl::math::DynMatrix<Type> &);
102 
103  #define ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW(Type,Size,TypeSuffix) \
104  typedef Eigen::Map<Eigen::Matrix<Type,Size,Size,Eigen::ColMajor>,Eigen::Unaligned,Eigen::Stride<1,Size> > \
105  ICLEigenMapColMajor##Size##TypeSuffix; \
106  typedef Eigen::Map<Eigen::Matrix<Type,Size,Size,Eigen::RowMajor>,Eigen::Aligned,Eigen::Stride<0,0> > \
107  ICLEigenMapRowMajor##Size##TypeSuffix; \
108  template ICLEigenMapRowMajor##Size##TypeSuffix iclToEigenRowMajorShallow<Type,Size,Size>(icl::math::FixedMatrix<Type,Size,Size> &); \
109  template ICLEigenMapColMajor##Size##TypeSuffix iclToEigenColMajorShallow<Type,Size,Size>(icl::math::FixedMatrix<Type,Size,Size> &);
110 
111  #define ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW_DYN(Type,TypeSuffix) \
112  typedef Eigen::Map<Eigen::Matrix<Type,Eigen::Dynamic,Eigen::Dynamic,Eigen::ColMajor>,Eigen::Unaligned,Eigen::Stride<Eigen::Dynamic,Eigen::Dynamic> > \
113  ICLEigenMapColMajorDyn##TypeSuffix; \
114  typedef Eigen::Map<Eigen::Matrix<Type,Eigen::Dynamic,Eigen::Dynamic,Eigen::RowMajor>,Eigen::Aligned> \
115  ICLEigenMapRowMajorDyn##TypeSuffix; \
116  template ICLEigenMapColMajorDyn##TypeSuffix iclToEigenDynColMajorShallow(icl::math::DynMatrix<Type> &ICL); \
117  template ICLEigenMapRowMajorDyn##TypeSuffix iclToEigenDynRowMajorShallow(icl::math::DynMatrix<Type> &ICL);
118 
119  #define ICL_INSTANCIATE_ICL_TO_EIGEN_ALL_SIZES(Type,TypeSuffix) \
120  ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW(Type,2,TypeSuffix)\
121  ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW(Type,3,TypeSuffix)\
122  ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW(Type,4,TypeSuffix)\
123  ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW_DYN(Type,TypeSuffix)\
124  ICL_INSTANCIATE_ICL_TO_EIGEN_DYN(Type)\
125  ICL_INSTANCIATE_ICL_TO_EIGEN(Type,2)\
126  ICL_INSTANCIATE_ICL_TO_EIGEN(Type,3)\
127  ICL_INSTANCIATE_ICL_TO_EIGEN(Type,4)
128 
129  ICL_INSTANCIATE_ICL_TO_EIGEN_ALL_SIZES(int,i)
130  ICL_INSTANCIATE_ICL_TO_EIGEN_ALL_SIZES(float,f)
131  ICL_INSTANCIATE_ICL_TO_EIGEN_ALL_SIZES(double,d)
132 
133  #undef ICL_INSTANCIATE_ICL_TO_EIGEN_ALL_SIZES
134  #undef ICL_INSTANCIATE_ICL_TO_EIGEN_DYN
135  #undef ICL_INSTANCIATE_ICL_TO_EIGEN
136  #undef ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW
137  #undef ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW_DYN
138 
139  } // namespace math
140 } // namespace icl
141 
142 #endif // ICL_HAVE_EIGEN3
Powerful and highly flexible matrix class implementation.
Definition: FixedMatrix.h:172
undocument this line if you encounter any issues!
Definition: Any.h:37
Highly flexible and optimized matrix class implementation.
Definition: DynMatrix.h:81
T * data()
return internal data pointer
Definition: FixedMatrix.h:453
unsigned int rows() const
height of the matrix (number of rows)
Definition: DynMatrix.h:471
unsigned int cols() const
width of the matrix (number of columns)
Definition: DynMatrix.h:474
T * data()
internal data pointer
Definition: DynMatrix.h:477