61 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <Eigen/Core>
 | |
| #include <iostream>
 | |
| 
 | |
| // [functor]
 | |
| template <class ArgType, class RowIndexType, class ColIndexType>
 | |
| class indexing_functor {
 | |
|   const ArgType& m_arg;
 | |
|   const RowIndexType& m_rowIndices;
 | |
|   const ColIndexType& m_colIndices;
 | |
| 
 | |
|  public:
 | |
|   typedef Eigen::Matrix<typename ArgType::Scalar, RowIndexType::SizeAtCompileTime, ColIndexType::SizeAtCompileTime,
 | |
|                         ArgType::Flags & Eigen::RowMajorBit ? Eigen::RowMajor : Eigen::ColMajor,
 | |
|                         RowIndexType::MaxSizeAtCompileTime, ColIndexType::MaxSizeAtCompileTime>
 | |
|       MatrixType;
 | |
| 
 | |
|   indexing_functor(const ArgType& arg, const RowIndexType& row_indices, const ColIndexType& col_indices)
 | |
|       : m_arg(arg), m_rowIndices(row_indices), m_colIndices(col_indices) {}
 | |
| 
 | |
|   const typename ArgType::Scalar& operator()(Eigen::Index row, Eigen::Index col) const {
 | |
|     return m_arg(m_rowIndices[row], m_colIndices[col]);
 | |
|   }
 | |
| };
 | |
| // [functor]
 | |
| 
 | |
| // [function]
 | |
| template <class ArgType, class RowIndexType, class ColIndexType>
 | |
| Eigen::CwiseNullaryOp<indexing_functor<ArgType, RowIndexType, ColIndexType>,
 | |
|                       typename indexing_functor<ArgType, RowIndexType, ColIndexType>::MatrixType>
 | |
| mat_indexing(const Eigen::MatrixBase<ArgType>& arg, const RowIndexType& row_indices, const ColIndexType& col_indices) {
 | |
|   typedef indexing_functor<ArgType, RowIndexType, ColIndexType> Func;
 | |
|   typedef typename Func::MatrixType MatrixType;
 | |
|   return MatrixType::NullaryExpr(row_indices.size(), col_indices.size(), Func(arg.derived(), row_indices, col_indices));
 | |
| }
 | |
| // [function]
 | |
| 
 | |
| int main() {
 | |
|   std::cout << "[main1]\n";
 | |
|   Eigen::MatrixXi A = Eigen::MatrixXi::Random(4, 4);
 | |
|   Eigen::Array3i ri(1, 2, 1);
 | |
|   Eigen::ArrayXi ci(6);
 | |
|   ci << 3, 2, 1, 0, 0, 2;
 | |
|   Eigen::MatrixXi B = mat_indexing(A, ri, ci);
 | |
|   std::cout << "A =" << std::endl;
 | |
|   std::cout << A << std::endl << std::endl;
 | |
|   std::cout << "A([" << ri.transpose() << "], [" << ci.transpose() << "]) =" << std::endl;
 | |
|   std::cout << B << std::endl;
 | |
|   std::cout << "[main1]\n";
 | |
| 
 | |
|   std::cout << "[main2]\n";
 | |
|   B = mat_indexing(A, ri + 1, ci);
 | |
|   std::cout << "A(ri+1,ci) =" << std::endl;
 | |
|   std::cout << B << std::endl << std::endl;
 | |
|   B = mat_indexing(A, Eigen::ArrayXi::LinSpaced(13, 0, 12).unaryExpr([](int x) { return x % 4; }),
 | |
|                    Eigen::ArrayXi::LinSpaced(4, 0, 3));
 | |
|   std::cout << "A(ArrayXi::LinSpaced(13,0,12).unaryExpr([](int x){return x%4;}), ArrayXi::LinSpaced(4,0,3)) ="
 | |
|             << std::endl;
 | |
|   std::cout << B << std::endl << std::endl;
 | |
|   std::cout << "[main2]\n";
 | |
| }
 | 
