矩阵从标准矢量到矢量从特征/密集

时间:2015-11-06 08:06:44

标签: c++ matrix vector 3d eigen

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

  

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

在我的名为“ClassA”的班级中,我有以下公共成员:

  

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>

类型的变量

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

2 个答案:

答案 0 :(得分:0)

内部Eigen将向量表示为只有一列的矩阵。因此,矢量(就像“普通”矩阵)实际上是Eigen::Matrix模板类的实例。

为了简化程序员,Eigen使用C ++的typedef来定义矢量类,这些类是具有特定选项的Eigen::Matrix<>的同义词。例如,Vector3d中的Eigen类型为typedef,表示其元素为double并且有3行1列的矩阵:

typedef Matrix<double, 3, 1> Vector3d

Matrix模板类实际上有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 = double
  • _Rows = 3
  • _Cols = 1
  • _Options = 0(默认情况下)
  • _MaxRows = _Rows(默认情况下)= 3
  • _MaxCols = _Cols(默认情况下)= 1

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

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

答案 1 :(得分:0)

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

但是,如果你只需要使用 Matrix和Vector,那么你可以尝试Mat中的VecOpenCV类。 here是关于Mat的好教程。

此外,如果您不一定需要使用C ++,那么Octave会更方便。