Non sono sicuro di quello che vuoi, ma proverò a spiegare.
Stai mixando double e float nel codice (un MatrixXf è una matrice in cui ogni voce è un float). Per il momento suppongo che questo sia stato involontario e che tu voglia usare il doppio dappertutto; vedi sotto per se questa era davvero la tua intenzione.
L'istruzione Map<MatrixXd>(arrayd, n, n) = matrix
copia le voci di matrix
in arrayd
. E 'equivalente al ciclo
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
arrayd[i + j*n] = matrix(i, j);
Per copiare le voci di arrayd
in matrix
, si dovrebbe utilizzare l'assegnazione inversa: matrix = Map<MatrixXd>(arrayd, n, n)
.
Tuttavia, di solito la seguente tecnica è più utile:
void foo(MatrixXd matrix, int n) {
double* arrayd = matrix.data();
// do something with the array
}
punti Ora arrayd alle voci nella matrice e si può elaborarlo come qualsiasi matrice C++. I dati sono condivisi tra matrix
e arrayd
, quindi non è necessario copiare nulla alla fine. Per inciso, non è necessario passare n
alla funzione foo()
, perché è memorizzata nella matrice; usa matrix.rows() e matrix.cols() per interrogare il suo valore.
Se si desidera copiare un MatrixXf in una matrice di doppi, è necessario includere il cast esplicitamente. La sintassi in Eigen per questo è: Map<MatrixXd>(arrayd, n, n) = matrix.cast<double>()
.
fonte
2012-08-17 14:33:37
Che cos'è questa funzione Mappa <>? Puoi mostrarlo? –
Questo è tutto quello che so http://eigen.tuxfamily.org/dox/TutorialMapClass.html – Manolete