@@ -30,6 +30,28 @@ void setOnes(Eigen::Ref<MatType> mat) {
3030 mat.setOnes ();
3131}
3232
33+ template <typename MatType>
34+ Eigen::Ref<MatType> getBlock (Eigen::Ref<MatType> mat, Eigen::DenseIndex i,
35+ Eigen::DenseIndex j, Eigen::DenseIndex n,
36+ Eigen::DenseIndex m) {
37+ return mat.block (i, j, n, m);
38+ }
39+
40+ template <typename MatType>
41+ Eigen::Ref<MatType> editBlock (Eigen::Ref<MatType> mat, Eigen::DenseIndex i,
42+ Eigen::DenseIndex j, Eigen::DenseIndex n,
43+ Eigen::DenseIndex m) {
44+ typename Eigen::Ref<MatType>::BlockXpr B = mat.block (i, j, n, m);
45+ int k = 0 ;
46+ for (int i = 0 ; i < B.rows (); ++i) {
47+ for (int j = 0 ; j < B.cols (); ++j) {
48+ B (i, j) = k++;
49+ }
50+ }
51+ std::cout << " B:\n " << B << std::endl;
52+ return mat;
53+ }
54+
3355template <typename MatType>
3456void fill (Eigen::Ref<MatType> mat, const typename MatType::Scalar& value) {
3557 mat.fill (value);
@@ -52,6 +74,18 @@ const Eigen::Ref<const MatType> asConstRef(Eigen::Ref<MatType> mat) {
5274 return Eigen::Ref<const MatType>(mat);
5375}
5476
77+ struct modify_block {
78+ MatrixXd J;
79+ modify_block () : J(10 , 10 ) { J.setZero (); }
80+ void modify (int n, int m) { call (J.topLeftCorner (n, m)); }
81+ virtual void call (Eigen::Ref<MatrixXd> mat) = 0;
82+ };
83+
84+ struct modify_wrap : modify_block, bp::wrapper<modify_block> {
85+ modify_wrap () : modify_block() {}
86+ void call (Eigen::Ref<MatrixXd> mat) { this ->get_override (" call" )(mat); }
87+ };
88+
5589BOOST_PYTHON_MODULE (eigen_ref) {
5690 namespace bp = boost::python;
5791 eigenpy::enableEigenPy ();
@@ -77,4 +111,12 @@ BOOST_PYTHON_MODULE(eigen_ref) {
77111 (Eigen::Ref<MatrixXd>(*)(Eigen::Ref<MatrixXd>))asRef<MatrixXd>);
78112 bp::def (" asConstRef" , (const Eigen::Ref<const MatrixXd> (*)(
79113 Eigen::Ref<MatrixXd>))asConstRef<MatrixXd>);
114+
115+ bp::def (" getBlock" , &getBlock<MatrixXd>);
116+ bp::def (" editBlock" , &editBlock<MatrixXd>);
117+
118+ bp::class_<modify_wrap, boost::noncopyable>(" modify_block" , bp::init<>())
119+ .def_readonly (" J" , &modify_block::J)
120+ .def (" modify" , &modify_block::modify)
121+ .def (" call" , bp::pure_virtual (&modify_wrap::call));
80122}
0 commit comments