2015-11-06 134 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更方便。