2016-11-24 97 views
0

我對Eigen庫有一些問題。雖然我打電話的調整大小功能,當我嘗試牛逼訪問矩陣中的第二個for循環,我得到的Eigen MatrixX聲明失敗,雖然調用了調整大小

徵斷言指數= 0 & &指數大小()失敗

錯誤矩陣。

Eigen::Matrix<float, 1, 2> linearRegression(Eigen::Vector2f *p, int pointCount) 
{ 
    Eigen::MatrixXf M; 
    Eigen::Matrix<float, 1, 2> A; 
    Eigen::MatrixXf Y; 

    M.resize(pointCount, 2); 
    Y.resize(pointCount, 1); 

    for (int i = 0; i < pointCount; i++) 
    { 
     M(i, 0) = p[i].x(); 
     M(i, 1) = 1; 
     Y(i, 0) = p[i].y(); 
    } 

    A = (M.transpose() * M).inverse() * M.transpose() * Y; 
    return A; 
} 

我可以看到成員m_rows和Visual Studio調試器矩陣M的m_colsi不超過他們。該錯誤直接發生在i = 0

MatrixXf應該與Matrix<float, Dynamic, Dynamic>相同。

當我聲明一個常數pointCount並使用固定大小的矩陣時,一切正常。

Eigen::Matrix<float, 1, 2> linearRegression(Eigen::Vector2f *p, int pointCount) 
{ 
    const int pointCount = 30; 
    ... 
    Eigen::Matrix<float, pointCount, 2> M; 
    Eigen::Matrix<float, 1, 2> A; 
    Eigen::Matrix<float, pointCount, 1> Y; 
    ... 
} 

我在做什麼錯?

+0

可能你的矩陣A是原因?你打印出行()和列()訪問?嘗試使用正確的維度初始化矩陣,而不是在構建後調整大小。 –

+0

使用std :: vector作爲你的函數的參數,或者gsl :: span,與eigen強項無關:) –

回答

1

您的表達(M.transpose() * M).inverse() * M.transpose() * Y產生2行1列的矩陣,而A有1行2列。由於A是固定大小,調整大小不會在賦值時發生。要修復,添加轉置到您的表達式: ((M.transpose() * M).inverse() * M.transpose() * Y).transpose()