2016-02-28 238 views
4

我在使用特徵庫時出現錯誤,我試圖做的就是從Eigen :: VectorXf中減去一個標量。所以,我的代碼是什麼如下:編譯錯誤eigen:從矢量中減去標量

#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<float, Dynamic, 1>') and 'float') 
    VECTOR_TYPE test = singular_values - scale; 

Eigen/src/Core/../plugins/CommonCwiseBinaryOps.h:19:28: note: 
    candidate template ignored: could not match 
    'MatrixBase<type-parameter-0-0>' against 'float' 
EIGEN_MAKE_CWISE_BINARY_OP(operator-,internal::scalar_difference_op) 

回答

10

這是數學無效減去標量(這僅僅是一個一維向量)從一個矢量,所以Eigen正確地拋出一個錯誤。

相反,你應該寫

auto n = singular_values.size(); 
VECTOR_TYPE test = singular_values - offset * VECTOR_TYPE::Ones(n); 

而且,你可以看看array()功能,它提供了元素方面的轉變。

+0

是啊,該訣竅。謝謝! – Luca

+0

@Luca:不客氣! – davidhigh

10

最簡單的就是移動到所謂的"array"世界:

VECTOR_TYPE test = singular_values.array() - offset;