2013-10-28 2 views
1

의 구성원이 아닌,이 같은 오류를 얻을 : 다음 함수C++ 아이겐 '옵션'</p> <p>오류 C2039 : '옵션'내가 아이겐을위한 템플릿 기능을 만들려고 할 때마다 '아이겐 :: MatrixBase <Derived>'

template<typename Derived1, typename Derived2> 
void eig(const MatrixBase<Derived1> & A, MatrixBase<Derived2> & eigenvaluesBuff) { 
    EigenSolver<MatrixBase<Derived1>> es(A, false); 
    eigenvaluesBuff = es.eigenvalues().real().col(0); 
} 

행렬, A로부터 온 '아이겐 :: MatrixBase'

이 오류의 멤버가 아닌 다른 함수에 의해 리턴 된 MatrixXd이다. 내가 뭘 잘못하고 있는거야? 함수가 MatrixXd를 반환하면 그 결과를 Eigen의 템플릿 함수에 직접 전달할 수 있습니까?

답변

0

EigenSolver의 템플릿 매개 변수는 템플릿이 아닌 Eigen::Matrix 템플릿의 인스턴스가되어야합니다 (문서 here 참조). 그래서 내가 당신이 PlainObjectType에 주어진 표현과 일치하는 매트릭스 형태를 얻을 수 추가 할 수 있도록, 또한 다윗의 답변을 완료하려면

template<typename Derived1, typename Derived2> 
void eig(const MatrixBase<Derived1> & A, MatrixBase<Derived2> & eigenvaluesBuff) { 
    eigenvaluesBuff = A.eigenvalues(); 
} 
+0

나는 모든 기능을 가능한 한 MATLAB과 비슷하게 만들려고합니다. 이 경우 eig로 이름을 바꾸고 나중에 함수가 버퍼가 아닌 직접 eigenvalue를 반환하도록 만드는 것을 의미합니다. 귀하의 설명 주셔서 감사합니다 - 나는 그것을 시도 줄거야! – PThomasCS

1

에 기능을 단순화 할 수

template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols, typename Derived2> 
void eig(const Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> & A, MatrixBase<Derived2> & eigenvaluesBuff) { 
    typedef Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> MatrixType; 
    EigenSolver<MatrixType> es(A, false); 
    eigenvaluesBuff = es.eigenvalues().real().col(0); 
} 

에 템플릿 기능을 변경 것 . 그럼 좀 더 일반적인 해결책은 다음과 같습니다 :

template<typename Derived1, typename Derived2> 
void eig(const MatrixBase<Derived1> & A, MatrixBase<Derived2> & eigenvaluesBuff) { 
    EigenSolver<typename Derived1::PlainObjectType > es(A.derived(), false); 
    eigenvaluesBuff = es.eigenvalues().real().col(0); 
}