Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 执行数千次比较的最快方式_C++_Performance_C++11_Vector - Fatal编程技术网

C++ 执行数千次比较的最快方式

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

我正在开发一个图像处理工具,它可以将RGB颜色转换为人类可读的关键字。 我需要:

  • 初始化/声明1000个静态已知元素集
  • 在一个动态元件和整个1000个元件之间进行10次比较(总共10×1000次比较)
  • 重复步骤1和2,生成数千张图像
  • 每个元素都是如下所示的结构:

    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个立方体。然后每个空间被进一步划分,直到最小的美国可分割单元。这提供了一种快速搜索树的方法。但在搜索不适合一个分区的区域时,它会变得复杂。您可能会决定搜索多棵树,或者在它接触的所有树中放置对象的副本。对于圆或球体,您可能会落在树上