我正在处理图像和计算对象的氡变换。计算变换的函数接受向量作为输入:
pixel p;
vector<pixel> segObj //segObj is the object segmneted from the image
pixel是用户定义的结构,定义为:
struct pixel
{
float x, y; //x,y coordinates of the pixel
};
目前,我正在对向量进行元素明智的分配:
for(int ix=0; ix < element_count; ix++)
{
f.x = xCoordArray[ix];
f.y = yCoordArray[ix];
segObj.push_back(f);
//xCoordArray and yCoordArray are computed separately
}
for循环在处理大图像时会变慢。有没有办法直接将xCoordArray
和yCoordArray
分配给vector<pixel>segObj
我没有使用载体,所以任何帮助都会受到赞赏
也,
如果xCoordArray
,yCoordArray
可以计算为向量,是否有一种方法可以将它们连接起来,以便每个向量索引为两个值。
答案 0 :(得分:3)
缓慢的一个原因是在for
循环执行时由向量完成的重新分配(和复制)。在您的情况下,您可以这样做:
segObj.reserve(element_count); //DO THIS
for(int ix=0; ix < element_count; ix++)
{
f.x = xCoordArray[ix];
f.y = yCoordArray[ix];
segObj.push_back(f);
}
这至少会改进代码,因为在循环之前有一个分配,并且在执行for
循环时不会重新分配和复制。
如果你的编译器支持C ++ 11,那么你可以试试这个:
struct pixel
{
float x,y;
pixel(float x, float y) : x(x), y(y) {} //add this constructor
};
segObj.reserve(element_count); //DO THIS
for(int ix=0; ix < element_count; ix++)
{
segObj.emplace_back(xCoordArray[ix], yCoordArray[ix]);
}
请注意,它会调用emplace_back
,而不是push_back
。该成员函数仅适用于C ++ 11;它就地构造像素对象。添加到矢量时,不会复制像素对象:
template< class... Args >
void emplace_back( Args&&... args ); (since C++11)
将新元素追加到容器的末尾。该元素就地构建,即不执行复制或移动操作。使用与提供给函数的完全相同的参数调用元素的构造函数。
答案 1 :(得分:2)
您可以创建一个输入迭代器来生成pixel
个对象并直接分配它们。您可以使用以下内容直接初始化对象:
pixel iterator::operator*() const {
pixel rc = {
xCoordArray[index],
tCoordArray[index]
};
return rc;
}
那就是说,我有点怀疑这确实是瓶颈:您是否对您的代码进行了分析,或者您是否怀疑这是问题?