2012-08-17 5 views
6

double 배열을 기존 MatrixXd 구조에 매핑하려고합니다. 지금까지 Eigen 행렬을 간단한 배열로 매핑했지만 그 행렬을 다시 찾을 방법을 찾을 수 없습니다.배열을 기존 고유 행렬로 다시 매핑

void foo(MatrixXd matrix, int n){ 

double arrayd = new double[n*n]; 
// map the input matrix to an array 
Map<MatrixXd>(arrayd, n, n) = matrix; 

    //do something with the array 
      ....... 
// map array back to the existing matrix 

} 
+1

이지도 기능은 무엇입니까? 보여줄 수 있습니까? –

+0

그게 전부입니다 http://eigen.tuxfamily.org/dox/TutorialMapClass.html – Manolete

답변

13

나는 당신이 원하는 것이 무엇인지 모르겠다. 그러나 나는 설명하려고 노력할 것이다.

코드에서 double과 float을 혼합합니다 (MatrixXf는 모든 항목이 부동 소수 인 행렬입니다). 나는 이것이 당신이 사방 팔방을 사용하기를 원한다는 의도하지 않은 순간이라고 가정 할 것입니다. 이것이 정말로 당신의 의도인지에 대해서는 아래를보십시오.

Map<MatrixXd>(arrayd, n, n) = matrix 명령어는 matrix의 항목을 arrayd으로 복사합니다. matrix = Map<MatrixXd>(arrayd, n, n) : 그것은 matrixarrayd의 항목을 복사하려면 루프

for (int i = 0; i < n; ++i) 
    for (int j = 0; j < n; ++j) 
     arrayd[i + j*n] = matrix(i, j); 

동일합니다, 당신은 역 할당을 사용합니다. 행렬의 항목에

void foo(MatrixXd matrix, int n) { 
    double* arrayd = matrix.data(); 
    // do something with the array 
} 

이제 arrayd 점, 당신은 어떤 C++ 배열로 처리 할 수 ​​있습니다 :

그러나, 일반적으로 다음과 같은 기술은 더욱 유용하다. 데이터는 matrixarrayd 사이에서 공유되므로 끝에 아무 것도 복사하지 않아도됩니다. 덧붙여서 을 foo() 함수에 전달할 필요가 없습니다. 행렬에 저장되기 때문입니다. matrix.rows() 및 matrix.cols()를 사용하여 해당 값을 쿼리합니다.

MatrixXf를 double 배열에 복사하려면 캐스트를 명시 적으로 포함해야합니다. 이를위한 Eigen의 구문은 Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>()입니다.

+0

float 및 double과의 혼동에 대해 사과드립니다. 지금 업데이트되었습니다! – Manolete

+0

아주 좋은 설명입니다. 완전히 새로운 데이터가 arrayd에 복사되면 어떻게 될까요? 이 데이터는 매트릭스로도 공유됩니까? 아이디어는 GPU에 arrayd를 보내고, 계산을하고, CPU로 돌아가 MatrixXd에 데이터를 가지고 있습니다. – Manolete

+0

@Manolete 예, 작동합니다. –

8

역순으로 수행 할 필요가 없습니다.

Eigen :: Map을 사용할 때 원시 배열을 Eigen 클래스에 매핑합니다. 이것은 이제 Eighen 함수를 사용하여 읽거나 쓸 수 있음을 의미합니다.

매핑 된 배열을 수정하는 경우 변경 사항이 이미 있습니다. 원래 배열에 간단하게 액세스 할 수 있습니다.

float buffer[16]; //a raw array of float 

//let's map the array using an Eigen matrix 
Eigen::Map<Eigen::Matrix4f> eigenMatrix(buffer); 

//do something on the matrix 
eigenMatrix = Eigen::Matrix4f::Identity(); 


//now buffer will contain the following values 
//buffer = [1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1] 
관련 문제