C++ 执行数千次比较的最快方式
我正在开发一个图像处理工具,它可以将RGB颜色转换为人类可读的关键字。 我需要:C++ 执行数千次比较的最快方式,c++,performance,c++11,vector,C++,Performance,C++11,Vector,我正在开发一个图像处理工具,它可以将RGB颜色转换为人类可读的关键字。 我需要: 初始化/声明1000个静态已知元素集 在一个动态元件和整个1000个元件之间进行10次比较(总共10×1000次比较) 重复步骤1和2,生成数千张图像 每个元素都是如下所示的结构: struct KnownColor{ cv::Scalar rgb; std::string name; std::vector<std::string> strings; KnownCol
struct KnownColor{
cv::Scalar rgb;
std::string name;
std::vector<std::string> strings;
KnownColor ( cv::Scalar rgb, std::string name, std::vector<std::string> strings) :
rgb(rgb),
name(name),
strings(strings) {};
};
struct KnownColor{
标量rgb;
std::字符串名;
std::向量字符串;
KnownColor(cv::标量rgb、std::字符串名称、std::向量字符串):
rgb(rgb),
姓名,
字符串(字符串){};
};
目前,我正在使用静态std::vector
来存储它们。为了初始化这个向量,我正在使用一个名为once的函数,我将1000个元素放入向量中。使用KnownColor构造函数初始化每个结构:
static std::vector<CustomStruct> Vector;
void vectorInit() //I call this only once per image:
{
...
Vector.push_back(KnownColor(Scalar(188,198,204),"Metallic Silver",std::vector<std::string>{"gray"}));
Vector.push_back(KnownColor(Scalar(152,175,199),"Blue Gray",std::vector<std::string>{"gray","blue"}));
... (1000 push_back in total)
}
static std::vector;
void vectorInit()//我对每个图像只调用一次:
{
...
Vector.push_back(已知颜色(标量(188198204),“金属银”,标准::Vector{“gray”});
Vector.push_back(已知颜色(标量(152175199),“蓝灰色”,std::Vector{“灰色”,“蓝色”});
…(总共向后推1000个)
}
比较函数是返回最接近“knownColor”的标量与其人类可读关键字之间的自定义欧氏距离:
double min = std::numeric_limits<double>::max();
int index=0;
for(int i=0; i<KnownColors.size(); i++)
{
double tmp = scalarLABDistance(rgb,KnownColors[i].rgb);
if(tmp < distanceThreshold )
{
min = tmp;
break;
}
if(tmp < min )
{
min = tmp;
index = i;
}
}
return KnownColors[index].strings;
double min=std::numeric_limits::max();
int指数=0;
对于(int i=0;i我在类似情况下所做的是编写一个程序,用我需要的数据结构为我构建一个C文件。通常我用Perl或Python编写。数据可能是生成的,也可能是从数据文件读取的
您可以在编译时构建Boost数组,这不需要初始化时间。但是,在任何桌面类型的CPU上,将1000个元素写入向量应该是非常快的
搜索1000个元素是一个更大的问题
你说你在寻找欧几里德距离。游戏开发者用来解决这个问题的是一种称为二进制空间划分的技术。这可能会对你有所帮助。它的工作原理,非常粗略地说,是一个二维空间被划分为4个正方形。一个三维空间被划分为8个立方体。然后每个空间被进一步划分,直到最小的美国不可分割的单位。这提供了一种快速搜索树的方法。但搜索不适合一个分区的区域时会变得复杂。您可能会决定搜索多棵树,或者在它接触的所有树中放置对象的副本。对于圆或球体,您可能会返回到完美的距离计算,或者您可以将其细分为多个分区正方形/立方体,直到最小的单位,并称之为足够接近。有很多例子和文献
而且,我几乎可以肯定,您可以对其进行散列,因为2D BSP中的一个点是一个由2位位置值组成的字符串,它只是一个大小不同的整数,具体取决于您的BSP分辨率
看起来另一个很好的选择可能是kd树,这是一个“k”维度树。我没有使用过维度树,但从我刚刚读到的关于维度树的内容来看,它们在这方面非常有用。在类似的情况下,我所做的是编写一个程序,为我构建一个C文件,其中包含我需要的数据结构。通常我用Perl或Python编写。数据可能会生成,也可能从da读取ta文件
您可以在编译时构建Boost数组,这不需要初始化时间。但是,在任何桌面类型的CPU上,将1000个元素写入向量应该是非常快的
搜索1000个元素是一个更大的问题
你说你在寻找欧几里德距离。游戏开发者用来解决这个问题的是一种称为二进制空间划分的技术。这可能会对你有所帮助。它的工作原理,非常粗略地说,是一个二维空间被划分为4个正方形。一个三维空间被划分为8个立方体。然后每个空间被进一步划分,直到最小的美国不可分割的单位。这提供了一种快速搜索树的方法。但搜索不适合一个分区的区域时会变得复杂。您可能会决定搜索多棵树,或者在它接触的所有树中放置对象的副本。对于圆或球体,您可能会返回到完美的距离计算,或者您可以将其细分为多个分区正方形/立方体,直到最小的单位,并称之为足够接近。有很多例子和文献
而且,我几乎可以肯定,您可以对其进行散列,因为2D BSP中的一个点是一个由2位位置值组成的字符串,它只是一个大小不同的整数,具体取决于您的BSP分辨率
看起来另一个很好的选择可能是kd树,这是一个“k”维度树。我没有使用过维度树,但从我刚刚读到的关于维度树的内容来看,它们在这方面非常有用。在类似的情况下,我所做的是编写一个程序,为我构建一个C文件,其中包含我需要的数据结构。通常我用Perl或Python编写。数据可能会生成,也可能从da读取ta文件
您可以在编译时构建Boost数组,这不需要初始化时间。但是,在任何桌面类型的CPU上,将1000个元素写入向量应该是非常快的
搜索1000个元素是一个更大的问题
你说你在寻找欧几里德距离。游戏开发者用来解决这个问题的是一种称为二进制空间划分的技术。这可能会对你有所帮助。它的工作原理,非常粗略地说,是一个二维空间被划分为4个正方形。一个三维空间被划分为8个立方体。然后每个空间被进一步划分,直到最小的美国可分割单元。这提供了一种快速搜索树的方法。但在搜索不适合一个分区的区域时,它会变得复杂。您可能会决定搜索多棵树,或者在它接触的所有树中放置对象的副本。对于圆或球体,您可能会落在树上