| #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] |