2014-10-20 6 views
0

나는 선형 대수학을 내부적으로 수행하는 함수를 가지고 있지만, 정규 밀도 행렬과 대각 행렬을 모두 전달할 수 있기를 원한다. 나는 다음과 같은 구문 시도 :C++ Eigen : 일반 (고밀도) 매트릭스뿐만 아니라 DiagonalMatrix도 사용할 수있는 함수를 작성하는 방법은 무엇입니까?

void bla(const Vector* v, const Eigen::MatrixBase<float>* A, Vector* out) 
{ 
    int colunms = A->cols(); 
    .... 
} 

을하지만 MatrixBase은() 함수 COLS이 없기 때문에 그 컴파일되지 않습니다!

DiagonalMatrix 클래스에는 toDenseMatrix() 함수가 있지만 값의 내부 복사가 필요하므로 DiagonalMatrix에서 얻으려는 모든 최적화가 무효화됩니다.

어떻게하면됩니까?

+0

왜 포인터가 아닌 참조를 통과 할 수 있을까? –

+0

그것이 어떻게 다른지 알 수 없습니다. MatrixBase 참조에는 여전히 cols() 멤버 함수가 없습니다. –

+0

나는 그것이 당신의 문제에 대한 해결책 이라기보다 일반적인 조언이라고 생각했다. – leemes

답변

1

일반적인 Eigen 루틴은 매개 변수로 클래스 템플릿 template<typename Derived> MatrixBase을 가져와야합니다.이 템플릿 자체는 매개 변수로 템플릿 매개 변수로 사용되며 그로부터 파생되는 행렬 클래스 (즉, CRTP 패턴 사용)를 취합니다. 그러니까 기본적으로, 당신의 기능은 당신이 발견, 당신은 MatrixBase에서 실제로 사용할 수있는 경우에만 그 멤버 함수를 호출 할 수 있으며 cols() 실제로 사용할 수 없습니다,이 함수 내에서

template<typename Derived> 
    void foo(const Eigen::MatrixBase<Derived>& x) 
    { 
     //do something 
    } 

같은 방식으로 설정해야합니다. 그러나 멤버 함수 innerSizeouterSize을 사용할 수 있습니다. 저장 기능에 따라 각각 rows() and cols()와 같은 동작을합니다. 자세한 내용은 here을 참조하십시오.

그러나 여전히 이러한 기능을 사용할 수없는 경우 함수 오버로드를 통해 원하는 동작을 얻을 수 있습니다. 예를 들어, 일반적인 일상적인 촬영 행렬을 작성하고 위와 같이 cols()을 사용하고 대각선 행렬에 대해 하나의 과부하,

template<typename T> 
    void foo(const Eigen::DiagonalMatrix<T>& x) 
    { 
     //do something for diagonal matrices 
    } 
+0

감사합니다. davidhigh, 그 제안은 좋습니다. 나는 가장 일반적인 버전을 허용 할 것이기 때문에 먼저 innerSize와 outerSize를 시도 할 것이다. 오버로드 제안은 실수하지 않는 한 중복 코드가 필요합니다. MatrixBase에서 오버로드 된 연산자와 같은 것들을 사용할 수 있지만 col 및 행은 사용할 수 없지만 여전히 다소 놀랍습니다. –

+0

처음부터'rows()'와'cols()'를 기본 클래스에 포함하기에 충분히 기본적인 것 같아요. 하지만 전반적인 Eigen이 실제로 잘 설계 되었기 때문에 어떤 이유가있을 수 있습니다. – davidhigh

+0

그것은 당신이하고 싶은 것에 달려 있습니다. 대각 행렬에 조밀 한 행렬을 곱하려면 결과가 조밀 한 행렬이기 때문에 이렇게 작동하지 않습니다. 이 산수들은 당신의 기능에 반영되어야합니다. 더 구체적인 질문이 있으시면 질문에 덧붙이거나 새로운 기능을 더 잘 열어보십시오 ("대각선 및 조밀 한 매트릭스 제품"이라는 제목으로). – davidhigh