2016-10-28 10 views
0

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)。

答えて

0

あなたの場合、VectorXdをよく使うべきです。そうしないと、VectorXdがinitに渡されないことが確認されます。

ここでRefを使用する唯一の理由は、たとえばMatrixのコラムを使用してdataを初期化できるようにすることです。

最後に、別のバッファを参照するようにRefを再割り当てする場合は、新しいプレースメントを使用してRefのコンストラクタを再呼び出しします。最初にデストラクタを呼び出すことを忘れないでください。

+0

ggaelさんのおかげで本当にありがとうございます。さらに、私は自分の静的メンバー変数を初期化できるようにポインタに変換しなければなりませんでした(Refデフォルトコンストラクタなし)。この場合、パラメータとして渡されたVectorXdをコピーするのは私の目標です(実際のアプリケーションでは非常に大きい)。 Ceresが古典的な多型を使用していた場合は、私の変数の型としてshared_ptr (またはそのようなもの)を使用しますが、その実装によってこれは非常に困難になります。私が後にしていることをする良い方法を知っているならば、それを分かち合いましょう。再度、感謝します。 – delacoder

+0

次に、単に 'VectorXd'へのポインタを保存することもできます。 – ggael

+0

場合によっては、VectorXdにキャストできない(VectorXdの代わりに)のマップを渡す必要があることを除いて。 – delacoder

関連する問題