虽然调用了resize,但Eigen MatrixX断言失败了

时间:2016-11-24 10:26:47

标签: c++ matrix eigen

我对Eigen库有一些问题。当我尝试访问第二个for循环中的矩阵时,我得到了

  

特征断言指数= 0&& index size()失败

错误虽然我正在调用Matrix的resize函数。

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;
}

我可以在visual studio调试器中看到矩阵M的成员m_rowsm_cols,而i不会超过它们。该错误直接发生在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;
    ...
}

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的表达式(M.transpose() * M).inverse() * M.transpose() * Y会产生一个包含2行1列的矩阵,而A则包含1行和2列。由于A是固定大小,因此调整大小时不会发生。要修复,请在表达式中添加转置: ((M.transpose() * M).inverse() * M.transpose() * Y).transpose()