代码之家  ›  专栏  ›  技术社区  ›  Lionnel104

特征矩阵与向量之间的元素运算

  •  0
  • Lionnel104  · 技术社区  · 6 月前

    以下代码执行矩阵和向量之间的减法。向量在运行时自动广播到形状(30,7)。但如果 num sub_value 如果被声明为动态形状的矩阵/向量(如注释行所示),则代码编译失败并发出以下错误消息。

    void func(){
        // MatrixXf sub_value(1, 7);
        // MatrixXf num(30, 7);
        Matrix<float, 1, 7> sub_value;
        Matrix<float, 30, 7> num;
        sub_value << 1, 2, 3, 4, 5, 6, 7;
        num = MatrixXf::Zero(30, 7);
        num.array().rowwise() -= sub_value.array();
        std::cout << num << std::endl;
    }
    
    /usr/local/include/Eigen/src/Core/VectorwiseOp.h: In instantiation of ‘ExpressionType& Eigen::VectorwiseOp<ExpressionType, Direction>::operator-=(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::ArrayWrapper<Eigen::Matrix<float, -1, -1> >; ExpressionType = Eigen::ArrayWrapper<Eigen::Matrix<float, -1, -1> >; int Direction = 1]’:
    ROBO/test_eigen.cpp:14:46:   required from here
    /usr/local/include/Eigen/src/Core/VectorwiseOp.h:521:7: error: static assertion failed: YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX
      521 |       EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
          |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    

    有什么区别?

    2 回复  |  直到 6 月前
        1
  •  1
  •   chris_se    6 月前

    艾根氏病 .rowwise() 希望结合系数操作来查看行向量。

    这里的问题是,动态分配 MatrixXf sub_value(1, 7); 在Eigen看来,它不是一个行向量,因为在编译时无法确定它是一个。

    您要做的是:

    RowVectorXf sub_value(7);
    MatrixXf num(30, 7);
    

    如果输入对象 由于某种原因(因为在其他可能是矩阵的地方使用了相同的变量),您可以更改代码以检查它是否实际上是行向量,然后使用 .row(0) 选择该矩阵对象的第一行(也是唯一一行)以使Eigen满意:

    // alternatively throw an exception, the assert is just an example
    assert(sub_value.rows() == 1);
    num.array().rowwise() -= sub_value.row(0).array();
    
        2
  •  0
  •   avr-girl    6 月前

    你不需要投 array() .
    更改:
    num.array().rowwise() -= sub_value.array(); num.rowwise() -= sub_value;