【问题标题】:Eigen MatrixX assertion failed though resize is called尽管调用了调整大小,但 Eigen MatrixX 断言失败
【发布时间】:2016-11-24 10:26:47
【问题描述】:

我在使用 Eigen 库时遇到了一些问题。当我尝试在第二个 for 循环中访问矩阵时,我得到了

特征断言索引 = 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_colsi不超过它们。错误直接发生在i = 0

MatrixXf 应与Matrix&lt;float, Dynamic, Dynamic&gt; 相同。

当我声明一个常量 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;
    ...
}

我做错了什么?

【问题讨论】:

  • 可能你的矩阵A是原因?你打印出 rows() 和 cols() 访问吗?尝试用正确的维度初始化矩阵,而不是在构造后调整大小。
  • 使用 std::vector 作为函数的参数,或 gsl::span,与 eigen strong 无关 :)

标签: c++ matrix eigen


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多