| #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"; |
| } |
| |