2012-02-13 22 views
5

böyle eigen kullanılarak bir matris oluşturmak zaman:Neden memcpy, Eigen matris verilerini kopyalayamıyor, ancak std :: copy başarılı oluyor?

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

üretir:

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; 

1 4 7 
2 5 8 
3 6 9 

Her eleman baskı, veri vasıtasıyla gerçekleştirilen bir işaretçi ile yürüyebilir üretir

1 2 3 4 5 6 7 8 9 
I

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; 

Ancak

1 2 3 4 5 6 7 8 9 

üretir:

Ayrıca yığın aynı tipte bir dizi kopyalamak için std :: kopya kullanabilir, daha sonra dizi elemanları baskı eşdeğer kopya yapmak için memcpy kullanamıyorum.

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; 

1 0 0 0 0 0 0 0 0 

memcpy ben olması gerektiği beklediğiniz çıkmıyor neden Herhangi bir sebep üretir: Bu sadece ilk elemanı kopyalamak için yönetir?

cevap

8

Bir çift büyüklüğüne ile çarpın gerekir (? Veya yanlış onu kullanıyorum):

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

Aksi takdirde, sadece kopyaladığınız M.size() bayt ve her çift daha fazladır Makinenizdeki bir bayt.

Bu nedenle, muhtemelen sadece birinci ve ikinci çiftlere yazıyorsunuz (muhtemelen sisteminizdeki 8 bayttır, çünkü ilkini başarıyla kopyaladınız ve ikinci çifte muhtemelen büyük olasılıkla sıfır olan bir bayt kopyaladınız).