2016-11-09 5 views
2

2 차원의 double 배열을 Eigen :: Matrix에 매핑 할 수 있는지 그리고 그 방법을 이해할 수 없습니다. double** p으로받는 배열 double d[][]을 Eigen :: Matrix에 매핑 할 수 있습니까?2 차원 배열을 Eigen :: Matrix에 매핑하십시오.

1 차원 배열은 정상적으로 작동하지만 pEigen::Map<Eigen::Matrix<double, n, n>>에 매핑 할 수 없습니다. 그게 가능하고 어떻게 할 수 있습니까? 크기 n은 실제로 일정하지 않지만 하드 코딩 된 크기를 허용 할 수 있습니다.


여러 버전을 시도했지만 아무 것도 작동하지 않았습니다. 나는 다음과 같아야한다고 생각했다. (크기 n이 4 일 것이라고 가정하자.)

Eigen::Map<Eigen::Matrix<double, 4, 4>> p_OUTPUT(&p[0][0]); 

코드가 컴파일되고 실행되지만 첫 번째 열의 요소와 두 번째 열의 첫 번째 요소 만 올바른 값으로 매핑됩니다. 인수로 p[0]을 사용하면 같은 결과가 나타납니다. 시도한 다른 버전 (예 : & 제외)이 컴파일되지 않았습니다.

+0

당신이 뭘하려 보여 당신이 무엇을 달성하고자하는 수 있습니까? 'n'은 컴파일 시간이 일정합니까? 그리고'p'가'double **'입니까? –

+0

@AviGinsburg 답장을 보내 주셔서 감사합니다. 질문을 완료했습니다. 크기 'n'은 상수가 아니지만 하드 코딩 된 크기는 괜찮습니다. 예,'p [row] [col] + = ...'가 작동하기 때문에'p'는'double **'입니다. – AnBr

+0

[this] (http://stackoverflow.com/a/33669013/2899559) 게시물을 참조하십시오. –

답변

3

완벽을 기하기 위해 해결책을 찾았습니다. 앞서 언급 한 바와 같이 here 또는 here 연속 메모리가 아닌 저장소의 저장소가 문제입니다.

다음 해결책은 저에게 효과적입니다.

Eigen::MatrixXd ConvertToEigenMatrix(std::vector<std::vector<double>> data) 
{ 
    Eigen::MatrixXd eMatrix(data.size(), data[0].size()); 
    for (int i = 0; i < data.size(); ++i) 
     eMatrix.row(i) = Eigen::VectorXd::Map(&data[i][0], data[0].size()); 
    return eMatrix; 
} 
0

는 당신이 자신을 준 대답은 단서의 종류 : 열 - 주요 형식의 아이겐 기본적으로 저장 행렬을 의미하는이 행렬의 요소 :

m(0,0) m(0,1) m(0,2) 
m(1,0) m(1,1) m(1,2) 
m(2,0) m(2,1) m(2,2) 

큰에 저장됩니다 선형 배열 :

[m(0,0), m(1,0), m(2,0), m(0,1), m(1,1), m(2,1), m(0,2), m(1,2), m(2,2)] 

귀하의 데이터 (답변에서 판단)은 배열에서 메모리 연속 행을 철수하고 그 결과의 행로 할당하는 이유 인 행의 주요 형식으로되어 있습니다. 당신은 당신의 데이터가 RowMajor 형식입니다 Map을 알 수 있으며, 올바르게 데이터를 읽어야

Eigen::Map<Eigen::Matrix<double, 4, 4, Eigen::RowMajor>> p_OUTPUT(p); 
+0

아니요,'p'가 메모리의 연속적인 부분을 가리키고 있다고 가정하십시오. 'double ** '에 대해서는 보증하지 않습니다. –

+0

원래의 질문은'double []'로 함수에 전달되는'double [] []'이라고 말합니다. 배열로 선언 된 경우 메모리에서 연속됩니다. –