代码之家  ›  专栏  ›  技术社区  ›  R zu

带特征3库的.eval()转换矩阵乘法中的Segfault

  •  -3
  • R zu  · 技术社区  · 7 年前

    .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 回复  |  直到 7 年前
        1
  •  1
  •   Community CDub    5 年前

    如中所述 documentatipon

    逗号初始值设定项

    Eigen提供了一个逗号初始化语法,允许用户轻松地设置矩阵、向量或数组的所有系数。只需列出系数,从左上角开始,从左到右,从上到下。 . 如果列出的系数太少或太多,Eigen会抱怨。

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