带有Eigen 3库的.eval()转换矩阵乘法中的段错误

时间:2018-09-12 17:19:41

标签: c++ eigen

我添加了两个.eval()以防万一。我没有编译错误,也没有运行时警告。只是段错误。

感谢您帮助我解决此问题。

测试:

#include <Eigen/Eigen>
#include <iostream>
using namespace Eigen;

int main() {
    Matrix<float, Dynamic, Dynamic> mat_b;
    Matrix<float, Dynamic, Dynamic> mat_c;

    mat_b << 1.0, 0.0, 0.5, 0.5,
             0.0, 1.0, 0.5, 0.5,
             1.0, 0.0, 1.0, 0.0,
             0.0, 1.0, 0.0, 1.0;

    mat_c << 0.0, 0.0, 0.0, 0.0, 1.0, 0.0,
             0.0, 0.0, 0.0, 0.0, 0.0, 1.0,
             1.0, 0.0, 1.0, 0.0, 0.0, 0.0,
             1.0, 0.0, 0.0, 1.0, 0.0, 0.0;

    std::cout << (mat_b.transpose().eval() * mat_c).eval() << "\n";
}

结果:

Segmentation fault (core dumped)

1 个答案:

答案 0 :(得分:1)

documentatipon

中所述
  

逗号初始化程序

     

Eigen提供了一种逗号初始化程序语法,该语法使用户可以轻松设置矩阵,向量或数组的所有系数。只需列出系数,从左上角开始,从左到右,从上到下移动。 需要预先指定对象的大小。如果列出的系数太少或太多,Eigen就会抱怨。

重点是我的。如果您期望Matrix ctor会从您的格式中推断出大小,那么在C ++中根本不可能。看起来您创建了16x1和24x1矩阵,然后尝试将1x16(转置的第一个矩阵)乘以24x1,这是不合法的。