Home > front end >  Brace initialization of Eigen matrix
Brace initialization of Eigen matrix

Time:08-24

Using gcc 9.4.0 and Eigen 3.3.7, the following compiles without issue:

#include <Eigen/Dense>

int main(int Argc, char *Argv[]) {
    Eigen::Matrix<int, 1, 4> d = {1, 2, 3, 4};
}

Increasing the length by 1 provokes an error:

#include <Eigen/Dense>

int main(int Argc, char *Argv[]) {
    Eigen::Matrix<int, 1, 5> d = {1, 2, 3, 4, 5};
    }

foo.cpp:6:48: error: could not convert ‘{1, 2, 3, 4, 5}’ from ‘<brace-enclosed initializer list>’ to ‘Eigen::Matrix<int, 1, 5>’
    6 |     Eigen::Matrix<int, 1, 5> d = {1, 2, 3, 4, 5};
      |                                                ^
      |                                                |
      |                                                <brace-enclosed initializer list>

The second case is a copy of a line from the Eigen tutorial page.

Can someone explain the problem with the 2nd case?

UPDATE: Based on comments below, this appears to be a bug in the Eigen library. I've submitted a bug report.

CodePudding user response:

Can someone explain the problem with the 2nd case?

Technically there is nothing wrong with the 2nd case.

This seems to be a eigen library's bug that only happens when you use C 11 with gcc 9.4 and eigen trunk.

The error goes away if you change the standard to C 14 or higher.

See working demo with c 14 with gcc 9.4 and eigen trunk.


On the other hand the problem remains irrespective of the standard c version you use with eigen 3.3.7. Demo. I've tried different combinations of standard version with compiler versions and eigen library version and they seem to give inconsistent result. So, this is a bug in the library(eigen) and there is nothing wrong from your side.

CodePudding user response:

Brace initialization is not supported by Eigen 3.3.x. If you write

Eigen::Matrix<int, 1, 4> d = {1, 2, 3, 4};

It will call the Eigen::Matrix(S const& x, S const& y, S const& z, S const& w) constructor link. Eigen has constructors for up to 4 elements, which only work for vector-like matrices which have the correct number of elements at compile-time.

Initializer lists work with Eigen 3.4.x if C 11 or later is enabled: link.

  • Related