Re: [eigen] Assignment to MatrixBase fails assertion or SEGVs

[ Thread Index | Date Index | More Archives ]

Thanks for the report and test-case, that was interesting.

First of all, how to make it work with current Eigen: just replace the line
   noinit = mat;
   noinit.derived() = mat;

Now the reason why your code fails is the following. As you notice,

> In general, eigen sets the lhs to the size of the rhs.

However, in Eigen, only a Matrix can be resized, the class MatrixBase
doesnt have a resize() method (in the devel branch it has one but it
still doesn't actually allow to resize).

In order to fix that, we would need to make it so that
MatrixBase<Derived>::resize() calls Matrix::resize() when the Derived
type is Matrix.

We can do that with a template helper. I'm asking for opinions here.
Should we do that, in order to support Robert's code? If not, then we
still must make sure that at least we fail on an assert, not a


> This assignment using MatrixBase compiles nicely but fails at run time:
> Assertion failed: (rows() == other.rows() && cols() == other.cols()),
> function lazyAssign, file
> /u/lsst/products/DarwinX86/eigen/2.0.9/include/Eigen/src/Core/Assign.h, line
> 406.
> If you use static-sized arrays, you get a SEGV (g++ 4.3.4; os/x 10.6)
> (I care because of the way that SWIG generates code (see yesterday's
> problems);  I have almost everything working --- at least if you only want
> one type of Eigen arrays (e.g. float, RowMajor) playing with numpy at a
> time)
>                                R
> #include "Eigen/Core.h"
> using namespace Eigen;
> int main() {
> #if 0
>    MatrixBase<Matrix2f> noinit;
>    Matrix2f mat;
> #else
>    MatrixBase<MatrixXf> noinit;
>    MatrixXf mat(2, 2);
> #endif
>    noinit = mat;
> }

Mail converted by MHonArc 2.6.19+