当我使用Eigen创建矩阵时,如下所示:
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
我可以用指针遍历数据,打印每个元素:
double * d = M.data();
for(int i = 0;i<M.size();i++)
{
std::cout<<*d<<" ";
d++;
}
std::cout<<std::endl;
产生
1 2 3 4 5 6 7 8 9
我还可以使用std :: copy将其复制到堆栈中相同类型的数组,然后打印该数组的元素:
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;
产生
1 2 3 4 5 6 7 8 9
但是,我似乎无法使用memcpy来进行等效的复制。这只能设法复制第一个元素:
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没有按照我的预期做到这一点有什么好理由? (或者我使用它不正确?)
答案 0 :(得分:8)
你需要乘以双倍的大小:
memcpy(data_memcopy,M.data(),M.size() * sizeof(double));
否则,您只复制M.size()字节,并且每个double都是您机器上的多个字节。
所以你可能只写了第一和第二个双打(它们可能是你系统上的8个字节,因为你成功复制了第一个,而第二个你只能复制一个可能为零的字节)。 / p>