Eigen :: Ref変数を静的メンバーとして使用するには、initスタティックメソッドで初期化されるクラスが必要です。このようなもの:Eigen :: Ref <>をメンバ変数として
class CostFunction {
public:
static Eigen::Ref<Eigen::VectorXd> data;
static void init(const Eigen::Ref<Eigen::VectorXd>& d) {
data = d;
}
CostFunction() {}
};
int main() {
Eigen::VectorXd data = Eigen::VectorXd::Random(30);
CostFunction cf;
cf.init(data);
return 0;
}
これはコンパイルされません。
/var/tmp/doNotRemove/builds/fit3dceres/RHEL6_AMD64_GCC484_OPT/include/eigen3/Eigen/src/Core/Ref.h: In instantiation of ‘Eigen::RefBase<Derived>& Eigen::RefBase<Derived>::operator=(const Eigen::RefBase<Derived>&) [with Derived = Eigen::Ref<const Eigen::Matrix<double, -1, 1> >]’:
/var/tmp/doNotRemove/builds/fit3dceres/RHEL6_AMD64_GCC484_OPT/include/eigen3/Eigen/src/Core/Ref.h:229:77: required from here
/var/tmp/doNotRemove/builds/fit3dceres/RHEL6_AMD64_GCC484_OPT/include/eigen3/Eigen/src/Core/util/Macros.h:608:26: error: use of deleted function ‘Eigen::MapBase<Eigen::Ref<const Eigen::Matrix<double, -1, 1> >, 0>& Eigen::MapBase<Eigen::Ref<const Eigen::Matrix<double, -1, 1> >, 0>::operator=(const Eigen::MapBase<Eigen::Ref<const Eigen::Matrix<double, -1, 1> >, 0>&)’
Base::operator=(other); \
一般的に言えば、Eigen :: Refは別のEigen :: Refに割り当てることができないように見えます。 誰もこの制限が存在する理由と、Refをクラスの静的メンバー変数として格納する方法があるかどうかを知っていますか?
PS:私はEigen :: Refを使用しています。ここに書かれているように、https://eigen.tuxfamily.org/dox-devel/classEigen_1_1Ref.htmlは、ほとんどの固有型で機能する関数を実装する際に使用するジェネリック型のようなものです私のケース、VectorXdとMap)。
ggaelさんのおかげで本当にありがとうございます。さらに、私は自分の静的メンバー変数を初期化できるようにポインタに変換しなければなりませんでした(Refデフォルトコンストラクタなし)。この場合、パラメータとして渡されたVectorXdをコピーするのは私の目標です(実際のアプリケーションでは非常に大きい)。 Ceresが古典的な多型を使用していた場合は、私の変数の型としてshared_ptr(またはそのようなもの)を使用しますが、その実装によってこれは非常に困難になります。私が後にしていることをする良い方法を知っているならば、それを分かち合いましょう。再度、感謝します。 –
delacoder
次に、単に 'VectorXd'へのポインタを保存することもできます。 – ggael
場合によっては、VectorXdにキャストできない(VectorXdの代わりに)のマップを渡す必要があることを除いて。 –
delacoder