特征矩阵的大括号初始化

Joh*_*bas 2 c++ eigen list-initialization

使用 gcc 9.4.0 和 Eigen 3.3.7,以下编译没有问题:

\n
#include <Eigen/Dense>\n\nint main(int Argc, char *Argv[]) {\n    Eigen::Matrix<int, 1, 4> d = {1, 2, 3, 4};\n}\n
Run Code Online (Sandbox Code Playgroud)\n

将长度增加 1 会引发错误:

\n
#include <Eigen/Dense>\n\nint main(int Argc, char *Argv[]) {\n    Eigen::Matrix<int, 1, 5> d = {1, 2, 3, 4, 5};\n    }\n\nfoo.cpp:6:48: error: could not convert \xe2\x80\x98{1, 2, 3, 4, 5}\xe2\x80\x99 from \xe2\x80\x98<brace-enclosed initializer list>\xe2\x80\x99 to \xe2\x80\x98Eigen::Matrix<int, 1, 5>\xe2\x80\x99\n    6 |     Eigen::Matrix<int, 1, 5> d = {1, 2, 3, 4, 5};\n      |                                                ^\n      |                                                |\n      |                                                <brace-enclosed initializer list>\n
Run Code Online (Sandbox Code Playgroud)\n

第二种情况是 Eigen 教程页面中一行的副本。

\n

有人可以解释一下第二种情况的问题吗?

\n

更新:根据下面的评论,这似乎是 Eigen 库中的一个错误。我已经提交了错误报告。

\n

更新更新:根据下面的答案,Eigen 3.3 特别允许大括号初始化程序最多 4 个参数,而 Eigen 3.4 允许一般大括号初始化。Mint 发行版是 3.3(3.4 发布一年后!),而 Eigen 文档现在指的是 3.4 版本。

\n

cht*_*htz 5

Eigen 3.3.x 不支持大括号初始化。如果你写

Eigen::Matrix<int, 1, 4> d = {1, 2, 3, 4};
Run Code Online (Sandbox Code Playgroud)

它将调用Eigen::Matrix(S const& x, S const& y, S const& z, S const& w)构造函数 link。Eigen 具有最多 4 个元素的构造函数,仅适用于在编译时具有正确元素数量的类向量矩阵。

如果启用了 C++11 或更高版本,初始化程序列表可与 Eigen 3.4.x 配合使用:链接

  • @MarekR 我添加了链接,但这些并不能保证永远有效。 (2认同)