来自MATLAB的代码优化直方图C

code optimization histogram c++ from matlab

本文关键字:直方图 代码优化 MATLAB 来自      更新时间:2023-10-16
LIBIQTOOL_API void Hist(std::vector<double>input, std::vector<double> bins, std::vector<double>& histogram)
{
    double minY = *std::min_element(std::begin(input), std::end(input));
    double maxY = *std::max_element(std::begin(input), std::end(input));
    std::vector<double> edges;    
    edges.push_back(-1 * std::numeric_limits<double>::infinity());
    for (int i = 0; i < bins.size() - 1; i++)
    {
        edges.push_back(bins[i] + 0.0100 / 2);
    }
    edges.push_back(std::numeric_limits<double>::infinity());

    //histC
    histogram.resize(edges.size() - 1);
#pragma omp parallel for
    for (int i = 0; i < input.size(); i++)
    {
        for (int j = 0; j < edges.size() - 1; j++)
        {
            if ((edges[j] < input[i]) && (input[i] <= edges[j + 1]))
            {
                histogram[j] = histogram[j] + 1;
                break;
            }
        }
    }
    histogram[histogram.size() - 1] = histogram[histogram.size() - 1] + histogram[histogram.size() - 2];
    histogram.pop_back();
}

输入向量的尺寸为3,000,000 ,垃圾箱的数量为〜7000。
我掌握了matlab的hist()函数,并在C 中创建了我需要的代码。
但是运行时间很长,您能看到可以在这里完成的更多优化吗?
我做到了:
A。当您找到要放置当前数字的垃圾箱时暂停
b。使用OpenMP

可能的优化:

  • 不要按值传递输入数据,而是通过const参考
  • 请勿检查下限,只有在进行正确的垃圾箱的线性搜索时,每个垃圾箱的上限。
  • 另外:由于您的垃圾箱是单调订购的,没有差距,请进行二进制搜索正确的垃圾箱,而不是线性搜索。

最后一个应该给您最大的收益,其他人更容易实施。

btw填充边缘向量看起来很奇怪。