2015-11-06 127 views
0

我尝试读出使用向量的标准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;

现在,当我读双打到载体中使用本征/密库中创建,载体的类型成为矩阵:

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>

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

+0

C++是一种静态类型语言。变量不会“变成”不同的类型。 –

+0

我认为有关'vectorEigen'类型的问题不再是真正的问题。也许你正在摔跤一些其他问题?实际上,你不需要'vectorEigen << matrix3D [i] [j] [k] .a << matrix3D [i] [j] [k] .b << matrix3D [i] [j] [k]。 c;'代替vectorEigen << matrix3D [i] [j] [k] .a,matrix3D [i] [j] [k] .b,matrix3D [i] [j] [k] .c;' – WhiteViking

+0

'vectorEigen << matrix3D [i] [j] [k] .a << matrix3D [i] [j] [k] .b << matrix3D [i] [j] [k] .c;'给我一个错误,不幸的是:( )当我调用以Vector3d作为输入参数的函数时会出现问题,将'vectorEigen'替换为函数的输入参数会导致编译器发生抱怨,原因是输入类型'Eigen :: Matrix '是undefined – bull

回答

0

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

然而,为了简化程序员,Eigen使用C++的typedef来定义具有特定选项的Eigen::Matrix<>的同义词的向量类。例如,Vector3d类型在Eigen为其元素是double个矩阵typedef和具有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 =双
  • _Rows = 3
  • _Cols = 1
  • _Options = 0(by defa ULT)
  • _MaxRows = _Rows(默认)= 3
  • _MaxCols = _Cols(默认)= 1

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

类型没有任何变化,您只需在代码中使用Vector3d速记符号,而编译器通过其显式类型引用它。

+0

感谢您的回复 问题是,我需要'vectorEigen'作为一个函数的输入,它需要一个Vector3d输入参数,编译器会在该行的那一行中声明该函数被调用:functionA(vectorEigen),其原因是'undefined reference',因为输入类型不匹配。 – bull

+0

@bull您是否包含正确的Eigen头文件?例如'#include '(这基本上包括所有的Eigen,这是过度的,但可能会帮助您找到问题。) – WhiteViking

+0

我包括'',但只是更改为''。然而,错误仍然存​​在... – bull

0

如果你只是对使用C++实现矩阵和向量感兴趣,那么你完全可以忽略我的答案。

但是,如果你只需要使用矩阵和Vector,那么你可以尝试在OpenCVMatVec类。而here是一个关于Mat的好教程。

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

相关问题