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)
ベクトルからスカラー(単なる1次元ベクトル)を減算することは数学的に無効であるため、Eigenは正しくエラーをスローします。
代わりに、あなたは書くべきです
_auto n = singular_values.size();
VECTOR_TYPE test = singular_values - offset * VECTOR_TYPE::Ones(n);
_
さらに、要素ごとの変換を提供するarray()
機能を確認できます。
最も簡単なのは、いわゆる "array" worldに移動することです:
VECTOR_TYPE test = singular_values.array() - offset;
私が間違っていない場合は、ブロードキャスト操作を使用することもできます。
VECTOR_TYPE test = singular_values.rowwise() - offset;