为什么Eigen不能解析内置符号?(all、last、seq等)



我在Eigen文档网站上有一段关于切片和解算的代码:

#include <iostream>
#include <Eigen/Dense>
#include <vector>
using namespace std;
using namespace Eigen;
int main() {
std::vector<int> ind{4,2,5,5,3};
MatrixXi A = MatrixXi::Random(4,6);
cout << "Initial matrix A:n" << A << "nn";
cout << "A(all,ind):n" << A(all,ind) << "nn";
return 0;
}

当我尝试编译时,我会遇到多个错误,例如:

  • all不是Eigen的成员
  • 未在此范围中声明all
  • 未在此范围中声明last
  • seq不是Eigen的成员
  • 无法解析函数seq
  • MatrixXi::Random无效参数

如何修复这些错误


看起来我有错误版本的Eigen(它在这里起作用(,然而,根据这个答案,我有:EIGEN_WORLD_VERSION 3EIGEN_MAJOR_VERSION 3CCD_ 11,我相信这是最新的。

就安装而言,我将Eigen文件夹复制到项目位置,并为g++编译器提供了一个路径(-I标志(到上面的一个文件夹。图书馆本身似乎运作良好;例如,此代码(来自提供的示例(运行良好:

#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
Matrix3d m = Matrix3d::Random();
m = (m + Matrix3d::Constant(1.2)) * 50;
cout << "m =" << endl << m << endl;
Vector3d v(1,2,3);
cout << "m * v =" << endl << m * v << endl;
}

您的问题可能是g++的-I选项

我怀疑你有类似的东西:

g++  ....  -I<path_to_project>/Eigen

而它应该只是

g++  ....  -I<path_to_project>

即最终的Eigen目录不应该在包含路径上。

进行此更改,然后也更改源代码,使所有包含的内容都像:

#include <Eigen/Dense>
#include <Eigen/Cholesky>

此外,您引用了一个变量all,但您的程序尚未定义它。

还要确保您至少启用了c++11编译器选项。


编辑:

为了完整起见,我添加了评论中出现的答案。OP问题中的文档指的是不支持符号alllastseq的3.3.9版本。对于最新的稳定(3.3.7(版本,必须使用blockreshape运算符。

这里的教训是:始终检查文档版本是否与所用库的版本匹配

最新更新