特征值:从向量中减去标量
eigen: Subtracting a scalar from a vector
我在使用 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;
最后一行导致编译错误为:
error: invalid operands to binary expression ('Eigen::VectorXf' (aka
'Matrix') and 'float')
VECTOR_TYPE test = singular_values - scale;
Eigen/src/Core/../plugins/CommonCwiseBinaryOps.h:19:28: note:
candidate template ignored: could not match
'MatrixBase' against 'float'
EIGEN_MAKE_CWISE_BINARY_OP(operator-,internal::scalar_difference_op)
从向量中减去标量(只是一维向量)在数学上是无效的,因此 Eigen 会正确地抛出错误。
相反,你应该写
auto n = singular_values.size();
VECTOR_TYPE test = singular_values - offset * VECTOR_TYPE::Ones(n);
此外,您可以查看 array()
提供逐元素转换的功能。
最简单的就是搬到所谓的"array"世界:
VECTOR_TYPE test = singular_values.array() - offset;
如果我没记错你也可以使用广播操作:
VECTOR_TYPE test = singular_values.rowwise() - offset;
我在使用 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;
最后一行导致编译错误为:
error: invalid operands to binary expression ('Eigen::VectorXf' (aka 'Matrix') and 'float') VECTOR_TYPE test = singular_values - scale;
Eigen/src/Core/../plugins/CommonCwiseBinaryOps.h:19:28: note: candidate template ignored: could not match 'MatrixBase' against 'float' EIGEN_MAKE_CWISE_BINARY_OP(operator-,internal::scalar_difference_op)
从向量中减去标量(只是一维向量)在数学上是无效的,因此 Eigen 会正确地抛出错误。
相反,你应该写
auto n = singular_values.size();
VECTOR_TYPE test = singular_values - offset * VECTOR_TYPE::Ones(n);
此外,您可以查看 array()
提供逐元素转换的功能。
最简单的就是搬到所谓的"array"世界:
VECTOR_TYPE test = singular_values.array() - offset;
如果我没记错你也可以使用广播操作:
VECTOR_TYPE test = singular_values.rowwise() - offset;