2014-03-05 2 views
0

을 기대하고있는 함수에 전달 내 Eigen C++ 메소드 중 일부는 일반 C++에서 호출 할 수 있어야하므로 C 배열을 허용하고 Eigen :: Map을 사용하여 ArrayXd에 매핑하는 오버로드 된 함수를 제공하려고합니다. Eigen :: Map을 ArrayXd &

코드는 I 현재이 같은 모습을 가지고 :

bool Dmp::executeStep(double* position, double* velocity, 
        double* acceleration, const int len) 
{ 
    Map<ArrayXd> posMap(position, len); 
    Map<ArrayXd> velMap(velocity, len); 
    Map<ArrayXd> accMap(acceleration, len); 
    return executeStep(posMap, velMap, accMap); 
} 


bool Dmp::executeStep(ArrayXd& position, ArrayXd& velocity, ArrayXd& acceleration) 
{ 
//Code that modifies position, velocity and acceleration 
} 

Map<ArrayXd>에서 ArrayXd&에 알려진 대화가 없기 때문에이 작동하지 않습니다. 이 작업을 수행하는 올바른 방법은 무엇입니까?

편집 : 작동합니다 아래 지적 luk32 대답은, 그러나 그것은 내가 가능한 모든 경우에 방지하고자하는 뭔가 헤더 파일에 코드를 옮기기 포함한다.

+0

'Eigen'와'c' 태그? 정말로 ... 도대체. – luk32

+0

@ luk32 죄송합니다, c 태그를 제거했습니다 –

답변

1

executeStep 템플릿 기능을 만들어야합니다. 또는 Ref과 같은 다른 시설을 사용하십시오. Writing Functions Taking Eigen Types as Parameters에 관한 문서에 포괄적 인 자습서가 있습니다.

나는 MapEigenBase보다 더 직접적인 부모 (아마도 짙은 정말 확실하지)가있는 경우 잘 모르겠지만, 그것은 가장 일반적인 그대로 작동합니다 :

물론
template <typename Derived> 
void Dmp::executeStep(EigenBase<Derived>& pos,EigenBase<Derived>& vel, EigenBase<Derived>& acc) 
{ 
// fun ... 
} 

당신이로 선언 할 필요가 템플릿 회원도.

전체 튜토리얼을 읽는 것이 좋습니다.

Ref 구현을 사용하십시오. 그러나 Map에서 MyMatrix에 사본이 있다면 확실하지 않습니다. Ref 개체는 DenseMatrix으로 전송되므로 허용되지 않습니다.

#include <Eigen/Core> 
#include <iostream> 

using namespace Eigen; 

typedef Matrix<int,2,4> MyMatrix ; 

void print_size(const Ref<const MyMatrix>& b) 
{ 
    std::cout << "size (rows, cols): " << b.size() << " (" << b.rows() 
      << ", " << b.cols() << ")" << "\n"; 
} 

int main() 
{ 
    int array[8]; 
    for(int i = 0; i < 8; ++i) array[i] = i; 
    Map<MyMatrix> map(array); 
    std::cout << "Column-major:\n" << map << "\n"; 
    print_size(map); 
} 
+0

예, 이것이 효과가 있습니다. 그러나 헤더 파일로 코드를 옮겨야하는데, 가능한 경우이를 피하고 싶습니다. 다른 방법이 없다면이 대답을 받아 들일 것입니다. –

+0

@ ArneBöckmann 자습서를 읽었는지 잘 모르겠지만 3.2.1 이후에는'Ref' 기능이 있습니다. – luk32

+0

3.2.1에서 도입 된? 그래서 왜 우리 고유의 설치에서 찾을 수 없었는지 설명합니다. 나는 eigen을 업그레이드하는 것이 지금 옵션이 아니라고 생각합니다 :/나는이 대답을 받아들이고 누군가에게 고유 버전을 업그레이드하도록 설득합니다 : D –

1

이 정확하게는 Ref<> 클래스의 목적이다 :

bool Dmp::executeStep(Ref<ArrayXd> position, Ref<ArrayXd> velocity, Ref<ArrayXd> acceleration) 
{ 
}