我在使用Eigen库时遇到错误,我想要做的就是从Eigen :: VectorXf中减去一个标量.所以,我的代码如下:
#define VECTOR_TYPE Eigen::VectorXf
#define MATRIX_TYPE Eigen::MatrixXf
// myMat is of MATRIX_TYPE
JacobiSVD<MATRIX_TYPE> jacobi_svd(myMat,ComputeThinU | ComputeThinV);
const float offset = 3.0f;
VECTOR_TYPE singular_values = jacobi_svd.singularValues();
VECTOR_TYPE test = singular_values - offset;
Run Code Online (Sandbox Code Playgroud)
最后一行导致编译错误:
错误:二进制表达式的无效操作数('Eigen :: VectorXf'(又名'Matrix')和'浮动')VECTOR_TYPE test = singular_values - scale;
Eigen/src/Core /../ plugins/CommonCwiseBinaryOps.h:19:28:注意:候选模板被忽略:无法将'MatrixBase'与'float'匹配EIGEN_MAKE_CWISE_BINARY_OP(operator-,internal :: scalar_difference_op)
gga*_*ael 15
最简单的是转移到所谓的"阵列"世界:
VECTOR_TYPE test = singular_values.array() - offset;
Run Code Online (Sandbox Code Playgroud)
dav*_*igh 12
从向量中减去一个标量(它只是一维向量)在数学上是无效的,因此Eigen正确地抛出了一个错误.
相反,你应该写
auto n = singular_values.size();
VECTOR_TYPE test = singular_values - offset * VECTOR_TYPE::Ones(n);
Run Code Online (Sandbox Code Playgroud)
此外,您可以查看array()提供元素转换的功能.