web-dev-qa-db-ja.com

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;

最後の行では、次のようなコンパイルエラーが発生します。

エラー:バイナリ式のオペランドが無効です( 'Eigen :: VectorXf'(別名 'Matrix')および 'float')VECTOR_TYPE test = singular_values-スケール;

Eigen/src/Core /../ plugins/CommonCwiseBinaryOps.h:19:28:注:候補テンプレートは無視されました:「MatrixBase」を「float」と一致させることができませんでしたEIGEN_MAKE_CWISE_BINARY_OP(operator-、internal :: scalar_difference_op)

9
Luca

ベクトルからスカラー(単なる1次元ベクトル)を減算することは数学的に無効であるため、Eigenは正しくエラーをスローします。

代わりに、あなたは書くべきです

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

さらに、要素ごとの変換を提供するarray()機能を確認できます。

12
davidhigh

最も簡単なのは、いわゆる "array" worldに移動することです:

VECTOR_TYPE test = singular_values.array() - offset;
14
ggael

私が間違っていない場合は、ブロードキャスト操作を使用することもできます。

VECTOR_TYPE test = singular_values.rowwise() - offset;
1
Adrian