27 #ifndef TOMOGRAPHER_TOOLS_EIGENUTIL_H 28 #define TOMOGRAPHER_TOOLS_EIGENUTIL_H 41 #include <Eigen/Dense> 42 #include <Eigen/StdVector> 69 template<
typename EigenType>
85 namespace tomo_internal {
87 template<
typename Rng,
typename RndDist,
typename Scalar>
88 struct random_generator
90 typedef Scalar result_type;
95 random_generator(Rng & rng_, RndDist & rnddist_)
96 : rng(rng_), rnddist(rnddist_)
100 template<
typename Index>
101 inline const result_type operator() (Index, Index = 0)
const {
106 template<
typename Rng,
typename RndDist,
typename RealScalar>
107 struct random_generator<Rng, RndDist, std::complex<RealScalar> >
114 random_generator(Rng & rng_, RndDist & rnddist_)
115 : rng(rng_), rnddist(rnddist_)
119 template<
typename Index>
120 inline const result_type operator() (Index, Index = 0)
const {
121 return result_type(rnddist(rng), rnddist(rng));
132 template<
typename Rng,
typename RndDist,
typename Scalar>
133 struct functor_traits<Tomographer::Tools::tomo_internal::random_generator<Rng, RndDist, Scalar> >
134 {
enum { Cost = 50 * NumTraits<Scalar>::MulCost, PacketAccess =
false, IsRepeatable =
false }; };
151 template<
typename Der,
typename Rng,
typename RndDist,
typename... IndexTypes>
152 inline auto denseRandom(Rng & rng, RndDist &rnddist, IndexTypes... sizes)
154 tomo_internal::random_generator<Rng, RndDist, typename Eigen::internal::traits<Der>::Scalar>,
158 typedef typename Der::Scalar Scalar;
161 sizes..., tomo_internal::random_generator<Rng, RndDist, Scalar>(rng, rnddist)
171 namespace tomo_internal {
173 template<
typename Scalar,
typename IndexType>
174 struct can_basis_vec_generator
176 typedef Scalar result_type;
181 can_basis_vec_generator(IndexType k_, IndexType j_ = 0)
186 inline const result_type operator() (IndexType a, IndexType b = 0)
const {
187 return (a == k) && (b == j) ? result_type(1) : result_type(0);
196 template<
typename Scalar,
typename IndexType>
197 struct functor_traits<Tomographer::Tools::tomo_internal::can_basis_vec_generator<Scalar, IndexType> >
198 {
enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess =
false, IsRepeatable =
true }; };
199 template<
typename Scalar,
typename IndexType>
200 struct functor_has_linear_access<Tomographer::Tools::tomo_internal::can_basis_vec_generator<Scalar, IndexType> >
201 {
enum { ret = 0 }; };
211 template<
typename Der,
typename IndexType>
214 tomo_internal::can_basis_vec_generator<typename Eigen::internal::traits<Der>::Scalar, IndexType>,
218 typedef typename Der::Scalar Scalar;
221 size, tomo_internal::can_basis_vec_generator<Scalar, IndexType>(k)
229 template<
typename Der,
typename IndexType>
232 tomo_internal::can_basis_vec_generator<typename Eigen::internal::traits<Der>::Scalar, IndexType>,
236 typedef typename Der::Scalar Scalar;
239 rows, cols, tomo_internal::can_basis_vec_generator<Scalar, IndexType>(k, j)
250 namespace tomo_internal {
252 template<
typename Scalar>
253 struct powers_of_two_generator
257 powers_of_two_generator() { }
259 template<
typename IndexType>
260 inline const result_type operator() (IndexType a)
const {
264 template<
typename IndexType>
265 inline const result_type operator() (IndexType a, IndexType b)
const {
266 eigen_assert(b == 0 &&
"powers_of_two_generator may only be used with 1-D objects or with linear access!");
278 template<
typename Scalar>
279 struct functor_traits<Tomographer::Tools::tomo_internal::powers_of_two_generator<Scalar> >
280 {
enum { Cost = 8 * NumTraits<Scalar>::MulCost, PacketAccess =
false, IsRepeatable =
true }; };
304 template<
typename Der,
typename... IndexTypes>
307 tomo_internal::powers_of_two_generator<typename Eigen::internal::traits<Der>::Scalar>,
311 typedef typename Der::Scalar Scalar;
314 sizes..., tomo_internal::powers_of_two_generator<Scalar>()
339 template<
int RowFactorCTime,
int ColFactorCTime,
typename Derived,
340 typename std::enable_if<(RowFactorCTime == Eigen::Dynamic || ColFactorCTime == Eigen::Dynamic),
341 bool>::type dummy =
true>
345 eigen_assert(RowFactorCTime == Eigen::Dynamic || row_factor == RowFactorCTime);
346 eigen_assert(ColFactorCTime == Eigen::Dynamic || col_factor == ColFactorCTime);
347 return x.
replicate(row_factor, col_factor);
353 template<
int RowFactorCTime,
int ColFactorCTime,
typename Derived,
354 typename std::enable_if<(RowFactorCTime != Eigen::Dynamic && ColFactorCTime != Eigen::Dynamic),
355 bool>::type dummy2 =
true>
359 eigen_assert(row_factor == RowFactorCTime); (void)row_factor;
360 eigen_assert(col_factor == ColFactorCTime); (void)col_factor;
361 return x.template replicate<RowFactorCTime, ColFactorCTime>();
static const CwiseNullaryOp< CustomNullaryOp, Derived > NullaryExpr(Index rows, Index cols, const CustomNullaryOp &func)
Base namespace for the Tomographer project.
const Replicate< Derived, RowFactor, ColFactor > replicate() const