若二维vector每行的列数不同,不是标准的N*M矩阵形式
cudaMemcpy()函数在传输数据时,参数需要为指针类型,因为实际数据的限制,初始数据是通过vector<vector<Vec4f>>的形式存储的,难点在于此二维vector每行的列数并不相同,并不是一个完美矩阵形式,在此记录一下自己的实现方式
首先说一下最终的实现方案:
首先将二维vector中的每行转换为指针,可见理解为每行一块小内存。然后通过函数memcpy()将每块小内存拼接在一起。
//将此二维vector转化为一维指针
vector<vector<Vec4f>> Match_Lines_L;
//最后的结果指针
float* ans = new float[40000];
int newstride = 0;
for (int i = 0; i < Match_Lines_L.size(); i++)
{
//所需copy的字节大小
int copysize = 4 * Match_Lines_L[i].size() * sizeof(float);
memcpy(ans + newstride, (Match_Lines_L[i]).data(), copysize);
//更新ans中所需插入的位置
newstride += 4 * Match_Lines_L[i].size();
}
1、使用vector.data()方法获取指向二维vector第 i 行第一个元素的指针
2、确定函数memcpy()所需传输的小内存size
3、通过for循环遍历每行数据,将小内存拼接到ans中
注意:copysize大小为字节大小,应sizeof(DataType),同时,因为本文数据类型为Vec4f类型,转换为指针类型后,原本的一个数据被扩充为4个float类型的数据,因此还需*4。同时newstride即ans中所需插入数据的位置,无需sizeof(float),具体可参考函数memcpy()的用法。
若二维vector为一个标准的n*m矩阵形式
则可通过构造Mat形式间接的先将二维vector转换为Mat类型,然后通过Mat.data获取头指针,作为参数传入cudaMemcpy()
//此时的二维数组B为N*M的矩阵
vector<vector<Vec4f>> B;
Mat ANS = Mat::zeros(0, 4 * B[0].size(), CV_32FC1);
for (int i = 0; i < B.size(); i++)
{
cv::Mat temp(1, 4 * B[0].size(), cv::DataType<float>::type, B[i].data());
ANS.push_back(temp);
}
本文探讨如何处理二维vector,其每行列数不一致的情况,以适应cudaMemcpy()函数。通过将每一行转化为指针并拼接,实现非标准N*M矩阵数据的传输。在转换过程中,需要注意内存大小的计算,以及数据类型与指针之间的转换。对于标准的n*m矩阵形式的二维vector,可以先转换为Mat类型再进行操作。
216

被折叠的 条评论
为什么被折叠?



