2012-08-17 14 views
6

Chcę zmapować tablicę podwójną do istniejącej struktury MatrixXd. Do tej pory udało mi się odwzorować macierz Eigen na prostą tablicę, ale nie mogę znaleźć sposobu, aby to zrobić z powrotem.Odwzorowanie macierzy z powrotem na istniejącą matrycę macierzy

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

Co to jest funkcja mapy <>? Czy możesz to pokazać? –

+0

To wszystko, co wiem http://eigen.tuxfamily.org/dox/TutorialMapClass.html – Manolete

Odpowiedz

13

Nie jestem pewien, czego chcesz, ale spróbuję wyjaśnić.

Mieszanie podwójne i zmiennoprzecinkowe w kodzie (MatrixXf to macierz, w której każdy wpis jest zmiennoprzecinkowy). Założę się na chwilę, że to było niezamierzone i że chcesz używać wszędzie wszędzie; zobacz poniżej, czy to naprawdę była twoja intencja.

Instrukcja Map<MatrixXd>(arrayd, n, n) = matrix kopiuje wpisy matrix do arrayd. Jest to odpowiednik pętli

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

Aby skopiować wpisy arrayd do matrix, należy użyć zadania odwrotnego: matrix = Map<MatrixXd>(arrayd, n, n).

Jednak zazwyczaj następujące technika jest bardziej przydatne:

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

Teraz arrayd punkty do wpisów w macierzy i można przetwarzać je jak każdy C++ tablicy. Dane są udostępniane między matrix i arrayd, więc nie trzeba kopiować niczego z powrotem na końcu. Nawiasem mówiąc, nie trzeba przekazywać n do funkcji foo(), ponieważ jest ona przechowywana w macierzy; użyj matrix.rows() i matrix.cols(), aby sprawdzić jego wartość.

Jeśli chcesz skopiować MatrixXf do tablicy podwójnej, musisz wyraźnie dołączyć rzutowanie. Składnia w Eigen dla tego jest: Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>().

+0

Przepraszam za zamieszanie z floatem i podwójnym. Teraz zaktualizowany! – Manolete

+0

To jest bardzo dobre wytłumaczenie. Co się stanie, jeśli całkowicie nowe dane zostaną skopiowane do arrayd? Czy dane te będą również udostępniane w macierzy? Chodzi o to, aby wysłać arrayda na GPU, wykonać obliczenia iz powrotem do procesora mieć dane w MatrixXd – Manolete

+0

@Manolete Tak, to powinno działać –

8

Nie trzeba wykonywać żadnych operacji odwrotnych.

Podczas używania Eigen :: Map mapujesz surową tablicę na klasę Eigen. Oznacza to, że możesz teraz czytać lub zapisywać je za pomocą funkcji Eighen.

W przypadku modyfikacji zmapowanej tablicy zmiany już istnieją. Możesz po prostu uzyskać dostęp do oryginalnej tablicy.

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] 
Powiązane problemy