#pragma once #ifdef ICL_HAVE_EIGEN3 #include #include #include #include #include namespace icl { namespace math { //------------------------------------------------------------------------------------------ template // need ints here. otherwise template parameter cannot be deduced inline icl::math::FixedMatrix eigenToICL(Eigen::Matrix const &E) { icl::math::FixedMatrix result; for(unsigned int i = 0; i < COLS; ++i) for(unsigned int k = 0; k < ROWS; ++k) result(i,k) = E(k,i); return result; } template inline Eigen::Matrix iclToEigen(icl::math::FixedMatrix const &ICL) { Eigen::Matrix result; for(unsigned int i = 0; i < COLS; ++i) for(unsigned int k = 0; k < ROWS; ++k) result(k,i) = ICL(i,k); return result; } //------------------------------------------------------------------------------------------ template inline Eigen::Map,Eigen::Aligned,Eigen::Stride<0,0> > iclToEigenRowMajorShallow(icl::math::FixedMatrix &ICL) { Eigen::Map,Eigen::Aligned,Eigen::Stride<0,0> > result(ICL.data()); return result; } template inline Eigen::Map,Eigen::Unaligned,Eigen::Stride<1,COLS> > iclToEigenColMajorShallow(icl::math::FixedMatrix &ICL) { Eigen::Map,Eigen::Unaligned,Eigen::Stride<1,COLS> > result(ICL.data()); return result; } //------------------------------------------------------------------------------------------ template inline icl::math::DynMatrix eigenToICLDyn(Eigen::Matrix const &E) { icl::math::DynMatrix result(E.cols(),E.rows()); for(uint i = 0; i < E.cols(); ++i) for(uint k = 0; k < E.rows(); ++k) result(i,k) = E(k,i); return result; } template inline Eigen::Matrix iclToEigenDyn(icl::math::DynMatrix const &E) { Eigen::Matrix result(E.rows(),E.cols()); for(uint i = 0; i < E.cols(); ++i) for(uint k = 0; k < E.rows(); ++k) result(k,i) = E(i,k); return result; } //------------------------------------------------------------------------------------------ template inline Eigen::Map,Eigen::Aligned > iclToEigenDynRowMajorShallow(icl::math::DynMatrix &ICL) { Eigen::Map,Eigen::Aligned> result(ICL.data(),ICL.rows(),ICL.cols()); return result; } template inline Eigen::Map,Eigen::Unaligned,Eigen::Stride > iclToEigenDynColMajorShallow(icl::math::DynMatrix &ICL) { Eigen::Map,Eigen::Unaligned,Eigen::Stride > result(ICL.data(),ICL.rows(),ICL.cols(),Eigen::Stride(1,ICL.cols())); return result; } //------------------------------------------------------------------------------------------ #define ICL_INSTANCIATE_ICL_TO_EIGEN(Type,Size) \ template Eigen::Matrix iclToEigen(icl::math::FixedMatrix const &);\ template Eigen::Matrix iclToEigen(icl::math::FixedMatrix const &);\ template Eigen::Matrix iclToEigen(icl::math::FixedMatrix const &);\ template icl::math::FixedMatrix eigenToICL(Eigen::Matrix const &);\ template icl::math::FixedMatrix eigenToICL(Eigen::Matrix const &);\ template icl::math::FixedMatrix eigenToICL(Eigen::Matrix const &); #define ICL_INSTANCIATE_ICL_TO_EIGEN_DYN(Type) \ template icl::math::DynMatrix eigenToICLDyn(Eigen::Matrix const &); \ template Eigen::Matrix iclToEigenDyn(icl::math::DynMatrix const &); //template Eigen::Map> iclToEigenDynShallow(icl::math::DynMatrix &); #define ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW(Type,Size,TypeSuffix) \ typedef Eigen::Map,Eigen::Unaligned,Eigen::Stride<1,Size> > \ ICLEigenMapColMajor##Size##TypeSuffix; \ typedef Eigen::Map,Eigen::Aligned,Eigen::Stride<0,0> > \ ICLEigenMapRowMajor##Size##TypeSuffix; \ template ICLEigenMapRowMajor##Size##TypeSuffix iclToEigenRowMajorShallow(icl::math::FixedMatrix &); \ template ICLEigenMapColMajor##Size##TypeSuffix iclToEigenColMajorShallow(icl::math::FixedMatrix &); #define ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW_DYN(Type,TypeSuffix) \ typedef Eigen::Map,Eigen::Unaligned,Eigen::Stride > \ ICLEigenMapColMajorDyn##TypeSuffix; \ typedef Eigen::Map,Eigen::Aligned> \ ICLEigenMapRowMajorDyn##TypeSuffix; \ template ICLEigenMapColMajorDyn##TypeSuffix iclToEigenDynColMajorShallow(icl::math::DynMatrix &ICL); \ template ICLEigenMapRowMajorDyn##TypeSuffix iclToEigenDynRowMajorShallow(icl::math::DynMatrix &ICL); #define ICL_INSTANCIATE_ICL_TO_EIGEN_ALL_SIZES(Type,TypeSuffix) \ ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW(Type,2,TypeSuffix)\ ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW(Type,3,TypeSuffix)\ ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW(Type,4,TypeSuffix)\ ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW_DYN(Type,TypeSuffix)\ ICL_INSTANCIATE_ICL_TO_EIGEN_DYN(Type)\ ICL_INSTANCIATE_ICL_TO_EIGEN(Type,2)\ ICL_INSTANCIATE_ICL_TO_EIGEN(Type,3)\ ICL_INSTANCIATE_ICL_TO_EIGEN(Type,4) ICL_INSTANCIATE_ICL_TO_EIGEN_ALL_SIZES(int,i) ICL_INSTANCIATE_ICL_TO_EIGEN_ALL_SIZES(float,f) ICL_INSTANCIATE_ICL_TO_EIGEN_ALL_SIZES(double,d) #undef ICL_INSTANCIATE_ICL_TO_EIGEN_ALL_SIZES #undef ICL_INSTANCIATE_ICL_TO_EIGEN_DYN #undef ICL_INSTANCIATE_ICL_TO_EIGEN #undef ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW #undef ICL_INSTANCIATE_ICL_TO_EIGEN_SHALLOW_DYN } // namespace math } // namespace icl #endif // ICL_HAVE_EIGEN3