【问题标题】:Eigen Assertion error at run time运行时的特征断言错误
【发布时间】:2016-07-02 11:47:45
【问题描述】:

我正在编译一个使用多个 Eigen::MatrixXd 方法的程序,虽然我在编译时没有收到任何错误,但运行它时出现以下错误:

darwin-pi2: /usr/include/Eigen/src/Core/Assign.h:498: Derived& Eigen::DenseBase<Derived>::lazyAssign(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Matrix<double, -1, -1>; Derived = Eigen::Matrix<double, 15, 15, 0, 15, 15>]: Assertion `rows() == other.rows() && cols() == other.cols()' failed.

我猜这与特征矩阵有关,但我不明白Assertion rows() == other.rows() &amp;&amp; cols() == other.cols()' failed 是什么意思。

【问题讨论】:

    标签: c++ eigen


    【解决方案1】:

    因为Eigen::MatrixXd 在运行时确定尺寸,所以编译时大小检查都被禁用并推迟到运行时。

    在这种情况下,您似乎正在从一个动态大小的矩阵分配一个 15x15 的矩阵。尝试仔细检查和调试该动态的大小。

    【讨论】:

    • 我正在使用Eigen::MatrixXd,因为大小取决于变量,所以我不能使用固定大小的矩阵。确实,此时我需要它们为 15x15,这有什么问题?
    • @joaocandre 没有设计问题。只需在分配发生时使用调试器验证尺寸是否为 15x15。
    【解决方案2】:

    在matlab中,矩阵m的索引从1开始,而在eigen中,它从0开始。举个简单的例子。

    #include <iostream>
    #include <Eigen/Dense>
    using Eigen::MatrixXd;
    int main()
    {
      MatrixXd m(2,2);
      m(0,0) = 3;  //  INDEX starts from 0, not 1
      m(1,0) = 2.5;
      m(0,1) = -1;
      m(1,1) = m(1,0) + m(0,1);
      std::cout << m << std::endl;
    }
    

    更多信息,请点击docs

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 2015-06-27
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 2016-02-21
      相关资源
      最近更新 更多