2013-05-31 12 views
5

Sto usando matrici MatrixXd di Eigen sul mio codice e ad un certo punto ho bisogno di un 3D. Poiché Eigen non ha tipi di matrice tridimensionali, come è ottimizzato solo per algebra lineare, invece sto creando una matrice puntatore del tipo MatrixXd:Matrice di puntatori a Eigen Matrices

Eigen::MatrixXd *CVM =new Eigen::MatrixXd[100]; 
for (int i = 0; i < 100; i++){ 
    CVM[i]= Eigen::MatrixXd::Zero(5,5); 
} 

Tuttavia, in seguito devo acess i valori in questo array , e per questo sto facendo qualcosa di simile:

for (int k = 0; k < 100; k++){ 
    Eigen::MatrixXd* b=&CVM[k]; 

    for (int i = 0; i < 5; i++){ 
     for (int j = 0; j < 5; j++){ 
     b->coeff(i,j)=47; 
     }  
    } 
} 

come b è un puntatore e non il MatrixXd sé, b(i,j) ovviamente non avrebbe funzionato, così invece sto utilizzando il metodo coeff(), tuttavia, ottengo il seguente errore:

error: assignment of read-only location ‘b->Eigen::Matrix<double, -1, -1>::<anonymous>.Eigen::PlainObjectBase<Derived>::coeff<Eigen::Matrix<double, -1, -1> >(((Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1> >::Index)i), ((Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1> >::Index)j))’ 

EDIT: Rese

cout << b << endl; 
cout << CVM[47] << endl; 


0x1c34b00 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
+0

'C++'? [tag: C++] mancante –

+0

Puoi mostrare cosa è 'b'? Inoltre, non hai una serie di puntatori. Si dispone di una matrice allocata dinamicamente contenente oggetti. – juanchopanza

+0

Immagino che ci sia un errore di battitura, la seconda riga 'a' dovrebbe essere 'b'? – ggael

risposta

4

O utilizzare b->coeffRef(i,j) per ottenere un riferimento di lettura/scrittura, o dereferenziare B: (*b)(i,j), o utilizzare un riferimento per la B:

MatrixXd& b = CVM[k]; 
b(i,j) = 47; 
1

Basta usare operatore() (int, int)

CVM[k].operator()(i,j) = 47; 

o

CVM[k](i,j) = 47; 

o

Eigen::MatrixXd* b = &CVM[k]; 
b->operator()(i,j) = 47; 

Qui k è la matrice, i è la riga e j è la colonna.

Problemi correlati