2012-08-17 19 views
6

Quiero asignar una matriz de matrices a una estructura MatrixXd existente. Hasta ahora he logrado asignar la matriz Eigen a una matriz simple, pero no puedo encontrar la manera de hacerlo de nuevo.Asignación de matriz a una matriz Eigen existente

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

¿Qué es esta función Map <>? ¿Puedes mostrarlo? –

+0

Eso es todo lo que sé http://eigen.tuxfamily.org/dox/TutorialMapClass.html – Manolete

Respuesta

13

No estoy seguro de lo que quiere, pero intentaré explicarlo.

Está mezclando dobles y flotantes en su código (un MatrixXf es una matriz donde cada entrada es un flotante). Asumiré por el momento que esto no fue intencional y que desea usar el doble en todas partes; ver a continuación para si esta era realmente su intención.

La instrucción Map<MatrixXd>(arrayd, n, n) = matrix copia las entradas de matrix en arrayd. Es equivalente al bucle

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

Para copiar las entradas de arrayd en matrix, utilizaría la asignación inversa: matrix = Map<MatrixXd>(arrayd, n, n).

Sin embargo, por lo general la siguiente técnica es más útil:

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

puntos Ahora arrayd a las entradas de la matriz y se puede procesar como cualquier matriz C++. Los datos se comparten entre matrix y arrayd, por lo que no tiene que copiar nada al final. Por cierto, no necesita pasar n a la función foo(), porque está almacenado en la matriz; use matrix.rows() y matrix.cols() para consultar su valor.

Si desea copiar un MatrixXf en una matriz de dobles, debe incluir el yeso explícitamente. La sintaxis en Eigen para esto es: Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>().

+0

disculpa la confusión con float y double. ¡Ahora actualizado! – Manolete

+0

Esa es una muy buena explicación. ¿Qué sucede si se copian datos totalmente nuevos en arrayd? ¿Esta información será compartida en matriz también? La idea es enviar arrayd a una GPU, hacer cálculos y volver a la CPU tener los datos en un MatrixXd – Manolete

+0

@Manolete Sí, eso debería funcionar –

8

No necesita realizar ninguna operación inversa.

Al usar Eigen :: Map está mapeando una matriz sin formato a una clase Eigen. Esto significa que ahora puede leerlo o escribirlo usando las funciones de Eighen.

En caso de que modifique la matriz asignada, los cambios ya están allí. Simplemente puede acceder a la matriz original.

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] 
Cuestiones relacionadas