Re: [eigen] Generic conservativeResize() for both matrices and vectors?

[ Thread Index | Date Index | More Archives ]

Hi Jose,

This behavior exists on purpose. The conservative_resize_like_impl
helper struct provides run(...) with two indices only for matrices and
not for vectors. The functionality you desire requires additional
error checks to be completely safe to guard against parameters
deviating from 1 when working with row vectors.

Your approach is the only workaround. I would change the templates a
bit and declare MatOrVecResizer as

  template<typename Derived, int R = Derived::RowsAtCompileTime, int C
= Derived::ColsAtCompileTime> struct MatOrVecResizer;

thus you have to write less when actually calling the helper as below


I don't consider your solution as ugly but what I would be worried
about is the fact that

  Matrix<double,1,Dynamic>  M;
  foo(M,1000,4); // this
  foo(M,1,4); // and this

do the same things without letting you know.

One alternative - which would be working for Matrices only is to
overload foo() for dynamic matrices as well as row and column vectors.
You would loose the compatibility with expressions templates but on
the other hand side resizing does not make much sense on general
expressions - pretty much no sense at all. You could define them as

template <class Scalar> void foo(
Eigen::Matrix<Scalar,Dynamic,Dynamic> &m, int nRows, int nCols );
template <class Scalar> void foo( Eigen::Matrix<Scalar,Dynamic,1> &m,
int nRows, int nCols );
template <class Scalar> void foo( Eigen::Matrix<Scalar,1,Dynamic> &m,
int nRows, int nCols );

Kind regards,

Mail converted by MHonArc 2.6.19+