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