在C ++中,我有以下代码。我试图将存储在矢量中的数据复制到矩阵中(在矢量内)。我试过这样做:
Vector<float> vec;
// Let's imagine that vec contains 10 float values: {1,2,3 ...., 10}
// I'd like to copy those numbers into a Mat variable
Vector<Mat> myMats;
myMats.push_back(Mat(2,5,CV_32FC1,&vec.front()));
有效。但是!当修改向量“vec”上的内容并尝试将其插入到我的Mat向量中的另一个位置时,它们都获得了最后一次“push_back”操作的值。 “myMats”中的所有条目都会被最后一个条目覆盖。我怎么解决这个问题?
我认为问题是使用引用(“&amp;”)每次修改地址,在哪里查看。
答案 0 :(得分:2)
确定。我已经弄明白了怎么做(创建一个临时的Mat)
mcard_list mcardlist = new mcard_list();
numberoftimes = 0;
timesheet.AddTomcard_list(mcardlist);
while (numberoftimes < collectionnumbers)
{
var FieldName = mcardlistfields[numberoftimes, 0].ToString();
var FieldType = mcardlistfields[numberoftimes, 1].ToString();
switch (FieldType)
{
case "String" :
mcardlist. + FieldName = "Test"; <=I know wrong here but i don't know how to do.
break;
case "DateTime" :
mcardlist. + FieldName = "2015-1-23"; <=I know wrong here I don't know how to do it.
break;
}
numberoftimes += 1;
}
timesheet.SaveChanges();
我想有一种更有效的方法,但这样做没问题。
答案 1 :(得分:1)
cv::Mat
是一个带有指向实际数据的指针的容器。当你像这样创建一个cv::Mat
:
cv::Mat some_mat;
在堆栈中创建cv::Mat
,它将通过在其结构中保留指针来指向堆中的数据。当您使用其复制构造函数/ Assignment复制cv::Mat
时:
cv::Mat another_mat=some_mat;
或者这个:
some_vector_of_mats.push_back(some_mat);
将发生浅拷贝。换句话说,cv::Mat
(行和列计数,类型...)的标题将被深度复制,指向实际数据的指针将被浅层复制。但实际数据不会被复制。那么在OP案例中发生的事情是,每次将cv :: Mat推送到向量时,都会发生浅拷贝。复制指针时不改变其值。所以,所有的cv :: Mat都指向同一个地方。因此导致其中一个数据的任何变化都会影响其他数据。