我正在努力将程序从matlab代码转换为C ++,我必须在Linux上使用opencv libs(gcc版本4.9.2)
所以我试图翻译这行matlab代码:
repeatedMat = repmat(originalMat,[1 1 k]);
我写的最后一个代码是:
void repeat(cv::Mat img, std::vector <cv::Mat> &output, uint32_t nx, uint32_t ny, uint32_t z)
{
cv::Mat tmpMat = cv::repeat(img, nx, ny);
output = std::vector <Mat> (z);
for (uint32_t i = 0; i < output.size(); i++)
output.insert(output.end(), tmpMat);
}
问题是我总是遇到 std :: bad_alloc 错误
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
我不确切知道为什么,但我在想一些内存泄漏.. 有没有更好的(和工作)方式来做到这一点?
答案 0 :(得分:2)
在C ++中,for
循环的条件在每次迭代中都会被计算,因此如果在向量的末尾添加一个新元素,它会增长1,所以在下一次迭代中,计数器{{ 1}}无法达到它。它应该是这样的:
i
但正如rahnema1在评论中所说,你不需要这样做。您可以创建一个包含相同元素的for (uint32_t i = 0; i < z; i++)
output.insert(output.end(), tmpMat);
个副本的向量,而无需复制它们:
z
另外,因为您已将问题标记为&#34; c ++ 11&#34;,请再提一个其他建议:按值返回向量,编译器将避免复制。
output = std::vector <Mat> (z, tmpMat);