The following works in Eigen 3.2.1:
VectorXf x = VectorXf::Random(48);
MatrixXf A = MatrixXf::Random(48, 6);
This continuation, which looks equivalent, trips assertions in
ArrayXXf B = ArrayXXf::Random(48, 6);
Originally reported in http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2014/05/msg00021.html in which Christoph gave some insight:
This does work:
B = (x.transpose()*B.matrix()).eval();
I seems the problem is that assigning a product to an array does not set the NeedEvalBeforeAssignment flag (which generally is not required for Array operations). This leads to B getting resized before the product is evaluated which evidently is a problem.
I'd say this is a bug in Eigen, not a usage error on your side!
The problem with B.matrix().applyOnTheLeft(...) and similar is that .matrix() expressions are writable but not resizable -- I'm not sure if this is by design. But it is similar to Maps which are not resizable either:
// only works if no resizing is needed:
Map<MatrixXf>(data, 48, 6).applyOnTheLeft(...);
We could make a more clear run-time assertion message for these cases.
E.g. "Operation requires resizing a non-resizable expression"
The continuation of that thread, including Christoph's comments, might require going to http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2014/06/maillist.html as the month changed in the interim.
I'm not sure we want to enable resizing of A.matrix().
However the following have to work:
B = (x.transpose()*B.matrix());
and it probably already does in the evaluator branch.
I added a regression test for the previous example: https://bitbucket.org/eigen/eigen/commits/899f757819d6
and I'd say wontfix for 3.2
-- GitLab Migration Automatic Message --
This bug has been migrated to gitlab.com's GitLab instance and has been closed from further activity.
You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.com/libeigen/eigen/issues/817.