以下代码对矩阵和向量进行减法。该向量在运行时自动广播为形状 (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)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
有什么区别?
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();
您无需投射到
array()
。num.array().rowwise() -= sub_value.array();
至 num.rowwise() -= sub_value;