|  | #include <Eigen/Core> | 
|  | #include <iostream> | 
|  |  | 
|  | using namespace Eigen; | 
|  |  | 
|  | // [circulant_func] | 
|  | template<class ArgType> | 
|  | class circulant_functor { | 
|  | const ArgType &m_vec; | 
|  | public: | 
|  | circulant_functor(const ArgType& arg) : m_vec(arg) {} | 
|  |  | 
|  | const typename ArgType::Scalar& operator() (Index row, Index col) const { | 
|  | Index index = row - col; | 
|  | if (index < 0) index += m_vec.size(); | 
|  | return m_vec(index); | 
|  | } | 
|  | }; | 
|  | // [circulant_func] | 
|  |  | 
|  | // [square] | 
|  | template<class ArgType> | 
|  | struct circulant_helper { | 
|  | typedef Matrix<typename ArgType::Scalar, | 
|  | ArgType::SizeAtCompileTime, | 
|  | ArgType::SizeAtCompileTime, | 
|  | ColMajor, | 
|  | ArgType::MaxSizeAtCompileTime, | 
|  | ArgType::MaxSizeAtCompileTime> MatrixType; | 
|  | }; | 
|  | // [square] | 
|  |  | 
|  | // [makeCirculant] | 
|  | template <class ArgType> | 
|  | CwiseNullaryOp<circulant_functor<ArgType>, typename circulant_helper<ArgType>::MatrixType> | 
|  | makeCirculant(const Eigen::MatrixBase<ArgType>& arg) | 
|  | { | 
|  | typedef typename circulant_helper<ArgType>::MatrixType MatrixType; | 
|  | return MatrixType::NullaryExpr(arg.size(), arg.size(), circulant_functor<ArgType>(arg.derived())); | 
|  | } | 
|  | // [makeCirculant] | 
|  |  | 
|  | // [main] | 
|  | int main() | 
|  | { | 
|  | Eigen::VectorXd vec(4); | 
|  | vec << 1, 2, 4, 8; | 
|  | Eigen::MatrixXd mat; | 
|  | mat = makeCirculant(vec); | 
|  | std::cout << mat << std::endl; | 
|  | } | 
|  | // [main] |