从 std 向量到 Eigen/Dense 向量的矩阵

Matrix from std vector to vector from Eigen/Dense

我尝试从使用 std c++ 向量动态容器创建的 3D 矩阵中读出元素。 下面是我如何初始化我的矩阵:

typedef vector<vector<vector<ClassA> > > matrix3D;

在我名为 "ClassA" 的 class 中,我有以下 public 成员:

double a, b, c;

然后在我的主文件中,我用以下内容填充矩阵:

double varA=M_PI; double varB=varA; double varC=varA;

matrix3D[i][j][k].a = varA;

matrix3D[i][j][k].b = varB;

matrix3D[i][j][k].c = varC;

现在,当我将双打读入使用 Eigen/Dense 库创建的向量时,向量的类型变为矩阵:

    Vector3d vectorEigen;
    vectorEigen << matrix3D[i][j][k].a, matrix3D[i][j][k].b, matrix3D[i][j][k].c;

vectorEigen成为Eigen::Matrix<double, 3,1,0,3,1>

类型的变量

有人知道我错过了什么吗?

在内部,Eigen 将向量表示为只有一列的矩阵。所以向量(就像 "ordinary" 矩阵)实际上是 Eigen::Matrix 模板 class.

的实例

然而,为了对程序员简单,Eigen 使用 C++ 的 typedef 来定义向量 classes,它们是具有特定选项的 Eigen::Matrix<> 的同义词。例如,Eigen 中的 Vector3d 类型是 typedef 的矩阵,其元素为 doubles 且具有 3 行和 1 列:

typedef Matrix<double, 3, 1> Vector3d

Matrix模板class实际上有6个模板参数,最后3个是默认参数。这是完整的签名:

template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
class Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols >

如果编译器在错误消息中引用 Eigen::Matrix<double, 3,1,0,3,1>,则它正在讨论具有以下模板参数的 Eigen::Matrix

  • _Scalar=双
  • _Rows = 3
  • _Cols = 1
  • _Options = 0(默认)
  • _MaxRows = _Rows(默认)= 3
  • _MaxCols = _Cols(默认)= 1

所以 Eigen::Matrix<double, 3,1,0,3,1> 只是编译器在解析 typedef 和模板参数后看到的 Vector3d 的完整类型。

类型根本没有改变,你只是在你的代码中使用 Vector3d shorthand 符号,而编译器通过它的显式类型引用它。

如果你只是对使用 C++ 实现 Matrix 和 Vector 感兴趣,那么你可以完全忽略我的回答。

但是,如果您只需要使用 矩阵和向量,那么您可以尝试Mat and Vec class in OpenCV. And here 关于矩阵的很好的教程。

另外,如果不是一定要用C++,那么Octave就更方便了。