2012-02-13 34 views
5

Khi tôi tạo ra một ma trận sử dụng Eigen, như thế này:Tại sao memcpy không sao chép dữ liệu ma trận Eigen, nhưng std :: copy thành công?

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; 

sản xuất

1 4 7 
2 5 8 
3 6 9 

tôi có thể đi bộ với một con trỏ qua các dữ liệu, in ấn mỗi phần tử:

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

sản xuất

1 2 3 4 5 6 7 8 9 

Tôi cũng có thể sử dụng std :: Copy để sao chép nó vào một mảng cùng loại trên stack, sau đó in các phần tử của mảng:

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; 

sản xuất

1 2 3 4 5 6 7 8 9 

Tuy nhiên, tôi dường như không thể sử dụng memcpy để làm bản sao tương đương. Đây chỉ quản lý để sao chép các yếu tố đầu tiên:

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; 

sản xuất

1 0 0 0 0 0 0 0 0 

Bất kỳ lý do chính đáng tại sao memcpy không được làm những gì tôi mong đợi nó nên? (Hay tôi sử dụng nó không đúng?)

Trả lời

8

Bạn cần phải nhân với kích thước của một đôi:

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

Nếu không, bạn chỉ việc sao chép M.size() byte, và mỗi đôi là hơn một byte trên máy của bạn. Vì vậy, bạn có thể chỉ ghi vào cặp đôi thứ nhất và thứ hai (chúng có thể là 8 byte trên hệ thống của bạn, vì bạn đã sao chép thành công đầu tiên, và lần thứ hai bạn chỉ sao chép một byte có khả năng là 0).

Các vấn đề liên quan