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

问题描述 投票:0回答:2

以下代码对矩阵和向量进行减法。该向量在运行时自动广播为形状 (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)
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

有什么区别?

c++ eigen eigen3
2个回答
0
投票

Eigen 的

.rowwise()
希望看到行向量与系数运算相结合。

这里的问题是,动态分配的

MatrixXf sub_value(1, 7);
在Eigen看来不是行向量,因为在编译时无法确定它是行向量。

你想做的是:

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

如果输入对象has由于某种原因是一个矩阵(因为在其他可能是矩阵的地方使用了相同的变量),您可以更改代码以执行检查它实际上是一个行向量,然后使用

.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();

0
投票

您无需投射到

array()

变化:
num.array().rowwise() -= sub_value.array();
num.rowwise() -= sub_value;

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.