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>()
.
Co to jest funkcja mapy <>? Czy możesz to pokazać? –
To wszystko, co wiem http://eigen.tuxfamily.org/dox/TutorialMapClass.html – Manolete