2014-11-20 19 views
5

È possibile utilizzare la sintassi foreach di C++ 11 con le matrici Eigen? Per esempio, se ho voluto per calcolare la somma di una matrice (So che c'è una funzione built-in per questo, volevo solo un semplice esempio) mi piacerebbe fare qualcosa di simileForeach loop su matrici Eigen?

Matrix2d a; 
a << 1, 2, 
    3, 4; 
double sum = 0.0; 
for(double d : a) { 
    sum += d; 
} 

Tuttavia Eigen non lo fa sembra consentirlo. Esiste un modo più naturale di eseguire un ciclo foreach sugli elementi di una matrice Eigen?

risposta

-1

Un puntatore all'array di dati della matrice può essere ottenuto utilizzando la funzione membro .data().

La dimensione dell'array di dati può anche essere ottenuta utilizzando la funzione membro .size().

Utilizzando questi due, ora abbiamo i puntatori al primo elemento e alla fine dell'array come a.data() e a.data()+a.size().

Inoltre, sappiamo che un std::vector può essere inizializzato utilizzando iteratori (o puntatori di array nel nostro caso).

Quindi, possiamo ottenere un vettore di doppi che avvolge gli elementi della matrice con std::vector<double>(a.data(), a.data()+a.size()).

Questo vettore può essere usato con la gamma-based per la sintassi del ciclo che è incluso nel frammento di codice come:

Matrix2d a; 
    a << 1, 2, 
     3, 4; 
    double sum = 0.0; 
    for(double d : std::vector<double>(a.data(), a.data()+a.size())) { 
     sum += d; 
    } 
+1

Questo eseguirà una copia della matrice, non itererà sulla matrice stessa, probabilmente non è qualcosa che il richiedente vuole fare. – sordid

2

Gamma-based per i cicli hanno bisogno di metodi .begin() e .end() da attuare su quel tipo , che non sono per le matrici di Eigen. Tuttavia, poiché un puntatore è anche un iteratore di accesso casuale valido in C++, i metodi .data() e .data() + .size() possono essere utilizzati per le funzioni di inizio e fine per qualsiasi algoritmo STL.

Problemi correlati