[eigen] Qt's container support

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


Hi all,

I think that being able to store Eigen's matrices in Qt's containers
is very important (especially QVector<>), and just like std::vector,
there are a couple of issues:

Issue 1:
QVector has a bug which avoids the use of QVector with types having a
custom operator new
 - problem solved in Qt 4.5
 - for earlier versions defining
EIGEN_WORK_AROUND_QT_BUG_CALLING_WRONG_OPERATOR_NEW_FIXED_IN_QT_4_5
before including Eigen/Core seems to do the job.
=> PROBLEM SOLVED.

Issue 2:
the second problem is to enforce QVector to allocate aligned memory
buffers. Fortunately, Qt's developers had the good idea to define
wrapper functions around malloc/free/realloc called qMalloc, qFree
etc.
So the workaround is simply to redefine these functions to call
ei_align_malloc. I added a Eigen/QtAlignedMalloc header which exactly
does that (I'll commit it once the next issue will be solved).
=> PROBLEM SOLVED

Issue3:
The last issue I found is with QVector::fill(const T&,size_t) which is
the equivalent of std::vector<T>::resize(size_t,T). Here the argument
is passed by reference so no alignment issue. The problem is the use
of the default ctor and operator= to initialize/copy the new elements
while our operator= does not allow to set an uninitialized matrix.
Solutions:
 a) allow operator= to set/resize an uninitialized matrix
 b) specialize QVector for Eigen's matrix type using a similar trick
than for std::vector such that we only have to redefine the fill()
method to use Matrix::set()
 c) do nothing and enforce the user to use .resize() followed by a for
loop instead of fill().

I vote for solution b)

any opinion ?

Gael.



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