28 #ifndef TOMOGRAPHER_TOOLS_EIGENUTIL_H 29 #define TOMOGRAPHER_TOOLS_EIGENUTIL_H 42 #include <Eigen/Dense> 43 #include <Eigen/StdVector> 70 template<
typename EigenType>
86 namespace tomo_internal {
88 template<
typename Rng,
typename RndDist,
typename Scalar>
89 struct random_generator
91 typedef Scalar result_type;
96 random_generator(Rng & rng_, RndDist & rnddist_)
97 : rng(rng_), rnddist(rnddist_)
101 template<
typename Index>
102 inline const result_type operator() (Index, Index = 0)
const {
107 template<
typename Rng,
typename RndDist,
typename RealScalar>
108 struct random_generator<Rng, RndDist, std::complex<RealScalar> >
115 random_generator(Rng & rng_, RndDist & rnddist_)
116 : rng(rng_), rnddist(rnddist_)
120 template<
typename Index>
121 inline const result_type operator() (Index, Index = 0)
const {
122 return result_type(rnddist(rng), rnddist(rng));
133 template<
typename Rng,
typename RndDist,
typename Scalar>
134 struct functor_traits<Tomographer::Tools::tomo_internal::random_generator<Rng, RndDist, Scalar> >
135 {
enum { Cost = 50 * NumTraits<Scalar>::MulCost, PacketAccess =
false, IsRepeatable =
false }; };
152 template<
typename Der,
typename Rng,
typename RndDist,
typename... IndexTypes>
153 inline auto denseRandom(Rng & rng, RndDist &rnddist, IndexTypes... sizes)
155 tomo_internal::random_generator<Rng, RndDist, typename Eigen::internal::traits<Der>::Scalar>,
159 typedef typename Der::Scalar Scalar;
162 sizes..., tomo_internal::random_generator<Rng, RndDist, Scalar>(rng, rnddist)
172 namespace tomo_internal {
174 template<
typename Scalar,
typename IndexType>
175 struct can_basis_vec_generator
177 typedef Scalar result_type;
182 can_basis_vec_generator(IndexType k_, IndexType j_ = 0)
187 inline const result_type operator() (IndexType a, IndexType b = 0)
const {
188 return (a == k) && (b == j) ? result_type(1) : result_type(0);
197 template<
typename Scalar,
typename IndexType>
198 struct functor_traits<Tomographer::Tools::tomo_internal::can_basis_vec_generator<Scalar, IndexType> >
199 {
enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess =
false, IsRepeatable =
true }; };
200 template<
typename Scalar,
typename IndexType>
201 struct functor_has_linear_access<Tomographer::Tools::tomo_internal::can_basis_vec_generator<Scalar, IndexType> >
202 {
enum { ret = 0 }; };
212 template<
typename Der,
typename IndexType>
215 tomo_internal::can_basis_vec_generator<typename Eigen::internal::traits<Der>::Scalar, IndexType>,
219 typedef typename Der::Scalar Scalar;
222 size, tomo_internal::can_basis_vec_generator<Scalar, IndexType>(k)
230 template<
typename Der,
typename IndexType>
233 tomo_internal::can_basis_vec_generator<typename Eigen::internal::traits<Der>::Scalar, IndexType>,
237 typedef typename Der::Scalar Scalar;
240 rows, cols, tomo_internal::can_basis_vec_generator<Scalar, IndexType>(k, j)
251 namespace tomo_internal {
253 template<
typename Scalar>
254 struct powers_of_two_generator
258 powers_of_two_generator() { }
260 template<
typename IndexType>
261 inline const result_type operator() (IndexType a)
const {
283 template<
typename Scalar>
284 struct functor_traits<Tomographer::Tools::tomo_internal::powers_of_two_generator<Scalar> >
285 {
enum { Cost = 8 * NumTraits<Scalar>::MulCost, PacketAccess =
false, IsRepeatable =
true }; };
305 template<
typename Der,
typename... IndexTypes>
308 tomo_internal::powers_of_two_generator<typename Eigen::internal::traits<Der>::Scalar>,
312 typedef typename Der::Scalar Scalar;
315 sizes..., tomo_internal::powers_of_two_generator<Scalar>()
340 template<
int RowFactorCTime,
int ColFactorCTime,
typename Derived,
341 typename std::enable_if<(RowFactorCTime == Eigen::Dynamic || ColFactorCTime == Eigen::Dynamic),
342 bool>::type dummy =
true>
346 eigen_assert(RowFactorCTime == Eigen::Dynamic || row_factor == RowFactorCTime);
347 eigen_assert(ColFactorCTime == Eigen::Dynamic || col_factor == ColFactorCTime);
348 return x.
replicate(row_factor, col_factor);
354 template<
int RowFactorCTime,
int ColFactorCTime,
typename Derived,
355 typename std::enable_if<(RowFactorCTime != Eigen::Dynamic && ColFactorCTime != Eigen::Dynamic),
356 bool>::type dummy2 =
true>
360 eigen_assert(row_factor == RowFactorCTime); (void)row_factor;
361 eigen_assert(col_factor == ColFactorCTime); (void)col_factor;
362 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