2016-11-11 1 views
0

컨텍스트에서 비선형 방정식 시스템 (루트 파인더)을 푸는 클래스를 작성하려고합니다. 이를 위해 생성자 생성자는 고유 벡터를 취하고 고유 벡터 (해결할 시스템)를 반환하는 함수를 취하여 func에 저장하고 newt 멤버 함수는 고유 벡터 (이니셜 추측), 그 초기 추측으로 알고리즘을 실행하고 func(r) = {0, 0, ..., 0}과 같은 고유 벡터 r을 반환합니다.고유 벡터를 인수로 사용하고 고유 벡터를 다른 클래스/함수로 전달하는 방법

이제 here : MatrixBase의 인스턴스를 취하는 템플릿 함수를 작성하여 클래스의 함수를 작성했습니다. 내 질문은, 클래스에 함수를 전달하려는 경우에도 비슷한 작업을 수행하려면 어떻게해야합니까? 내가 시도한 가장 확실한 접근법은 private std::function 객체를 저장하고 함수로 수행했던 것과 비슷한 방식으로 템플릿 화하는 것입니다. 그것은 잘 풀리지 않았고, 어떻게 진행해야할지 확신이 없습니다.

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 

어떤 아이디어 :

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); 
}; 

나는 다음과 같은 오류를 얻을? 내가 원하는 걸 어떻게 할 수 있니? 내가 실현하려고하는 것을 달성하기위한 대안적인 방법 (임의의 주어진 함수 "Eigen_Vector f(Eigen_Vector x)"에서 알고리즘을 실행하는 클래스 작성)은 무엇입니까?

답변

0

함수에 대한 참조를 클래스 멤버로 저장해야하는 경우 함수 유형을 클래스의 템플릿 매개 변수로 전달해야합니다 (Eigen::LevenbergMarquart과 유사). 예를 들어 :

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

당신은 다음과 같이 자동으로 펑터의 유형을 파악하는 도우미를 작성할 수 있습니다

auto solver = make_newt(my_func); 

my_func은 어떤 람다 포함 할 수있는 곳.

관련 문제