mirror of
				https://github.com/PaddlePaddle/FastDeploy.git
				synced 2025-10-31 11:56:44 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			52 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #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]
 | 
