diff options
author | Jitse Niesen <jitse@maths.leeds.ac.uk> | 2014-09-27 23:25:58 +0100 |
---|---|---|
committer | Jitse Niesen <jitse@maths.leeds.ac.uk> | 2014-09-27 23:25:58 +0100 |
commit | ce2035af868d57b85b4078c15843d5c1f51047dc (patch) | |
tree | ca6392457ba02fa24e8f5f0ddcf755697d73d36e /doc/examples | |
parent | 6d0f0b8cecd0ee944503d885fd34278044bab746 (diff) |
New doc page on implementing a new expression class.
Diffstat (limited to 'doc/examples')
-rw-r--r-- | doc/examples/make_circulant.cpp | 11 | ||||
-rw-r--r-- | doc/examples/make_circulant.cpp.entry | 5 | ||||
-rw-r--r-- | doc/examples/make_circulant.cpp.evaluator | 33 | ||||
-rw-r--r-- | doc/examples/make_circulant.cpp.expression | 20 | ||||
-rw-r--r-- | doc/examples/make_circulant.cpp.main | 8 | ||||
-rw-r--r-- | doc/examples/make_circulant.cpp.preamble | 4 | ||||
-rw-r--r-- | doc/examples/make_circulant.cpp.traits | 19 |
7 files changed, 100 insertions, 0 deletions
diff --git a/doc/examples/make_circulant.cpp b/doc/examples/make_circulant.cpp new file mode 100644 index 000000000..92e6aaa2b --- /dev/null +++ b/doc/examples/make_circulant.cpp @@ -0,0 +1,11 @@ +/* +This program is presented in several fragments in the doc page. +Every fragment is in its own file; this file simply combines them. +*/ + +#include "make_circulant.cpp.preamble" +#include "make_circulant.cpp.traits" +#include "make_circulant.cpp.expression" +#include "make_circulant.cpp.evaluator" +#include "make_circulant.cpp.entry" +#include "make_circulant.cpp.main" diff --git a/doc/examples/make_circulant.cpp.entry b/doc/examples/make_circulant.cpp.entry new file mode 100644 index 000000000..f9d2eb8a9 --- /dev/null +++ b/doc/examples/make_circulant.cpp.entry @@ -0,0 +1,5 @@ +template <class ArgType> +Circulant<ArgType> makeCirculant(const Eigen::MatrixBase<ArgType>& arg) +{ + return Circulant<ArgType>(arg.derived()); +} diff --git a/doc/examples/make_circulant.cpp.evaluator b/doc/examples/make_circulant.cpp.evaluator new file mode 100644 index 000000000..98713cdc0 --- /dev/null +++ b/doc/examples/make_circulant.cpp.evaluator @@ -0,0 +1,33 @@ +namespace Eigen { + namespace internal { + template<typename ArgType> + struct evaluator<Circulant<ArgType> > + : evaluator_base<Circulant<ArgType> > + { + typedef Circulant<ArgType> XprType; + typedef typename nested_eval<ArgType, XprType::ColsAtCompileTime>::type ArgTypeNested; + typedef typename remove_all<ArgTypeNested>::type ArgTypeNestedCleaned; + typedef typename XprType::CoeffReturnType CoeffReturnType; + typedef typename XprType::Index Index; + + enum { + CoeffReadCost = evaluator<ArgTypeNestedCleaned>::CoeffReadCost, + Flags = Eigen::ColMajor + }; + + evaluator(const XprType& xpr) + : m_argImpl(xpr.m_arg), m_rows(xpr.rows()) + { } + + CoeffReturnType coeff(Index row, Index col) const + { + Index index = row - col; + if (index < 0) index += m_rows; + return m_argImpl.coeff(index); + } + + typename evaluator<ArgTypeNestedCleaned>::nestedType m_argImpl; + const Index m_rows; + }; + } +} diff --git a/doc/examples/make_circulant.cpp.expression b/doc/examples/make_circulant.cpp.expression new file mode 100644 index 000000000..a68bcb730 --- /dev/null +++ b/doc/examples/make_circulant.cpp.expression @@ -0,0 +1,20 @@ +template <class ArgType> +class Circulant : public Eigen::MatrixBase<Circulant<ArgType> > +{ +public: + Circulant(const ArgType& arg) + : m_arg(arg) + { + EIGEN_STATIC_ASSERT(ArgType::ColsAtCompileTime == 1, + YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX); + } + + typedef typename Eigen::internal::ref_selector<Circulant>::type Nested; + + typedef typename Eigen::internal::traits<Circulant>::Index Index; + Index rows() const { return m_arg.rows(); } + Index cols() const { return m_arg.rows(); } + + typedef typename Eigen::internal::ref_selector<ArgType>::type ArgTypeNested; + ArgTypeNested m_arg; +}; diff --git a/doc/examples/make_circulant.cpp.main b/doc/examples/make_circulant.cpp.main new file mode 100644 index 000000000..877f97f62 --- /dev/null +++ b/doc/examples/make_circulant.cpp.main @@ -0,0 +1,8 @@ +int main() +{ + Eigen::VectorXd vec(4); + vec << 1, 2, 4, 8; + Eigen::MatrixXd mat; + mat = makeCirculant(vec); + std::cout << mat << std::endl; +} diff --git a/doc/examples/make_circulant.cpp.preamble b/doc/examples/make_circulant.cpp.preamble new file mode 100644 index 000000000..e575cce14 --- /dev/null +++ b/doc/examples/make_circulant.cpp.preamble @@ -0,0 +1,4 @@ +#include <Eigen/Core> +#include <iostream> + +template <class ArgType> class Circulant; diff --git a/doc/examples/make_circulant.cpp.traits b/doc/examples/make_circulant.cpp.traits new file mode 100644 index 000000000..f91e43717 --- /dev/null +++ b/doc/examples/make_circulant.cpp.traits @@ -0,0 +1,19 @@ +namespace Eigen { + namespace internal { + template <class ArgType> + struct traits<Circulant<ArgType> > + { + typedef Eigen::Dense StorageKind; + typedef Eigen::MatrixXpr XprKind; + typedef typename ArgType::Index Index; + typedef typename ArgType::Scalar Scalar; + enum { + Flags = Eigen::ColMajor, + RowsAtCompileTime = ArgType::RowsAtCompileTime, + ColsAtCompileTime = ArgType::RowsAtCompileTime, + MaxRowsAtCompileTime = ArgType::MaxRowsAtCompileTime, + MaxColsAtCompileTime = ArgType::MaxRowsAtCompileTime + }; + }; + } +} |