[eigen] Allow Dynamic as template parameter in fixed-size Eigen methods

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]


Hi all,

currently, many Eigen methods have a dynamic-size and a fixed-size version, e.g.

    VectorBlock<Derived> segment(Index start, Index size);
    VectorBlock<Derived, Size> segment<int Size>(Index start);

It would make generic programming a lot easier to add an overload

    VectorBlock<Derived, Size> segment<int Size>(Index start, Index size);
    {
        EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
        eigen_assert(Length == Dynamic || Length == length);
        return  VectorBlock<Derived, Size>(derived(), start, size);
    }

The first two methods could then refer to this one:

    VectorBlock<Derived> segment(Index start, Index size)
    {
        return segment<Dynamic>(start, size);
    }
    
    VectorBlock<Derived, Size> segment<int Size>(Index start)
    {
        EIGEN_STATIC_ASSERT(Size != Dynamic)
        return segment<Size>(start, Size);
    }

This change would enable use cases such as the following (contrived) example:

    template <int M>
    struct Foo
    {
        Foo(Index m) : a(m*2) {}

        void bar()
        {
            Index m = a.size() / 2;
            a.segment<M>(0, m) += a.segment<M>(m, m);
        }

        enum { Rows = M == Dynamic ? Dynamic : M*2 };

        Eigen::Array<float, Rows, 1> a;
    };

Marton



Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/