特征:从向量中减去标量

Luc*_*uca 7 c++ eigen

我在使用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)

  • 这应该是公认的答案。创建一个由 1 组成的向量会产生运行时成本,而转换为数组则不会。 (3认同)

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()提供元素转换的功能.