eigen matrixx断言失败了,尽管调整了大小

Eigen MatrixX assertion failed though resize is called

本文关键字:调整了 matrixx 断言 失败 eigen      更新时间:2023-10-16

我在特征库中有一些问题。当我尝试在第二个循环中访问矩阵时,我会得到

特征主张索引= 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;
}

我可以在Visual Studio调试器中看到矩阵M的成员m_rowsm_cols,并且i不超过它们。错误直接发生在i = 0

MatrixXf应该与 Matrix<float, Dynamic, Dynamic>相同。

当我声明一个恒定点并使用固定尺寸的矩阵时,一切都很好。

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

我在做什么错?

您的表达式 (M.transpose() * M).inverse() * M.transpose() * Y产生带有2行和1列的矩阵,而A具有1行和2列。因为A是固定尺寸,所以调整大小在分配时不会进行。要修复,请在您的表达中添加一个transpose: ((M.transpose() * M).inverse() * M.transpose() * Y).transpose()