2016-11-24 92 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()