컨텍스트에서 비선형 방정식 시스템 (루트 파인더)을 푸는 클래스를 작성하려고합니다. 이를 위해 생성자 생성자는 고유 벡터를 취하고 고유 벡터 (해결할 시스템)를 반환하는 함수를 취하여 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)
"에서 알고리즘을 실행하는 클래스 작성)은 무엇입니까?