从 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 的矩阵,其元素为 double
s 且具有 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就更方便了。
我尝试从使用 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 的矩阵,其元素为 double
s 且具有 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就更方便了。