2012-02-13 8 views
5

Quando creo una matrice utilizzando Eigen, in questo modo:Perché memcpy non riesce a copiare i dati della matrice Eigen, ma std :: copy ha esito positivo?

Eigen::MatrixXd M(3,3); 
    M<< 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 ; 
    std::cout<<M<<std::endl; 

produce

1 4 7 
2 5 8 
3 6 9 

posso camminare con un puntatore attraverso i dati, la stampa di ogni elemento:

double * d = M.data(); 
    for(int i = 0;i<M.size();i++) 
    { 
    std::cout<<*d<<" "; 
    d++; 
    } 
    std::cout<<std::endl; 

produce

1 2 3 4 5 6 7 8 9 

posso anche usare std :: copia per copiare in un array dello stesso tipo in pila, quindi stampare gli elementi di tale matrice:

double data_copy[9]; 
    std::copy(M.data(),M.data()+M.size(),data_copy); 
    for(int i = 0;i<M.size();i++) 
    { 
    std::cout<<data_copy[i]<<" "; 
    } 
    std::cout<<std::endl; 

produce

1 2 3 4 5 6 7 8 9 

Tuttavia, non riesco a usare memcpy per fare la copia equivalente. Questo riesce solo a copiare il primo elemento:

double data_memcopy[9]; 
    memcpy(data_memcopy,M.data(),M.size()); 
    for(int i = 0;i<M.size();i++) 
    { 
    std::cout<<data_memcopy[i]<<" "; 
    } 
    std::cout<<std::endl; 

produce

1 0 0 0 0 0 0 0 0 

Qualsiasi buona ragione per cui memcpy non sta facendo quello che mi aspetto dovrebbe? (O sto utilizzando in modo improprio?)

risposta

8

È necessario moltiplicare per la dimensione di un doppio:

memcpy(data_memcopy,M.data(),M.size() * sizeof(double)); 

In caso contrario, si sta solo copia) byte (M.size, e ciascuno è più che doppio un byte sul tuo computer.

Quindi probabilmente stavi scrivendo solo sul primo e sul secondo doppio (probabilmente sono 8 byte sul tuo sistema, poiché hai copiato il primo con successo, e il secondo doppio hai probabilmente solo copiato un byte che probabilmente era uno zero).