2016-11-11 9 views
0

文脈上、私は非線形方程式系を解くクラスを作成しようとしています(ルートファインダ)。このために私のインターフェースは以下の通りです:コンストラクタtakeはEigenベクトルをとり、解決するシステムであるEigenベクトルを返す関数をとり、funcに格納し、newtメンバ関数はEigenベクトル(初期推測)、その最初の推測でアルゴリズムを実行し、func(r) = {0, 0, ..., 0}のような固有ベクトルrを返します。固有値ベクトルを引数とし、固有ベクトルを別のクラス/関数に返す関数を渡す方法

hereMatrixBaseのインスタンス化を行うテンプレート関数を記述する指示に従って、クラスの関数を記述しました。私の質問は、私もクラスに関数を渡したい場合、私は何か似たようなやり方をしますか?私が試したもっとも明白なアプローチは、プライベートなstd::functionオブジェクトを格納し、その関数で行ったのと同様の方法でテンプレート化することです。それはうまくいかなかったし、進める方法がわからない。

class Newt { 
private: 
    template<typename TR, typename T1, typename T2, typename T3> 
    tuple<TR,bool> lnsrch(const MatrixBase<T1> &xold, const double fold, const MatrixBase<T2> &g, MatrixBase<T3> &p, const double stepmax); 

    template <typename TR, typename T1, typename T2> 
    TR fdjac(const MatrixBase<T1> &x, const MatrixBase<T2> &fvec); 

    template <typename TR, typename T1> 
    std::function<TR(MatrixBase<T1>)> func; 

public: 
    template <typename TR, typename T1> 
    Newt(std::function<TR(MatrixBase<T1>)> f) : func(f) { }; 

    template <typename T1, typename T2> 
    tuple<T1,bool> newt(const MatrixBase<T2> &xx); 
}; 

私は次のエラーを取得:

g++-6 -c -Wall -O2 -march=native -flto newt.cpp 
In file included from newt.cpp:8:0: 
newt.h:218:40: error: data member ‘func’ cannot be a member template 
    std::function<TR(MatrixBase<T1>)> func; 
             ^
newt.h: In constructor ‘Newt::Newt(std::function<TR(Eigen::MatrixBase<U>)>)’: 
newt.h:222:46: error: class ‘Newt’ does not have any field named ‘func’ 
    Newt(std::function<TR(MatrixBase<T1>)> f) : func(f) { }; 
               ^~~~ 
make: *** [newt.o] Error 1 

任意のアイデア?私は何をしたいのですか?私が遂行しようとしていることを達成するための代替方法(任意の与えられた関数 "Eigen_Vector f(Eigen_Vector x)"でアルゴリズムを実行するクラスを書く)?

答えて

0

関数への参照をクラスメンバとして格納する必要がある場合は、関数型をクラスのテンプレートパラメータとして渡す必要があります(Eigen::LevenbergMarquartと同様)。例えば:

my_funcを含む何でもラムダでき
auto solver = make_newt(my_func); 

template<typename Func> 
class Newt { 
    const Func& func; 
    public: 
    Newt(const Func& f) : func(f) {} 
}; 

あなたは、自動的にのような数子のタイプを把握するためにヘルパーを書くことができます。

関連する問題