在 C++ 中拟合 2d 高斯函数太慢了

Posted

技术标签:

【中文标题】在 C++ 中拟合 2d 高斯函数太慢了【英文标题】:Fitting 2d gauss function in C++ too slow 【发布时间】:2014-07-07 17:46:46 【问题描述】:

我正在尝试将 2d 高斯函数拟合到图像(采用 cv::Mat 格式),并且我正在使用 NLopt 库。

我把我的对象函数是这样的:

for(i for each row)
    for(j for each col)
    
        //compute the gauss function value
        double valuenow=x[0]*exp(-( x[3]*(j-x[1])*(j-x[1]) + 2*x[4]*(j-x[1])*(i-x[2]) + x[5]*(i-x[2])*(i-x[2]) ));
        //add square residual to result
        result+=(valuenow-fitdata.at<double>(i,j))*(valuenow-fitdata.at<double>(i,j));
    
return result;

我的矩阵大小约为 1000*1000,我使用的是 LN_COBYLA 算法。当我运行它时,结果发现它非常慢。我认为我指定对象函数的方式一定有问题,因为我曾经在 Matlab 中使用 lsqnonlinear 做同样的事情,它在一秒钟内返回。

有人可以帮帮我吗?提前致谢。

【问题讨论】:

【参考方案1】:

at&lt;&gt;() 函数很慢。如果速度至关重要,那么在循环中使用它不是一个好主意。在循环外取一个指针,然后在循环内使用该指针。

一个相关的问题: OpenCV Mat array access, which way is the fastest for and why?

【讨论】:

以上是关于在 C++ 中拟合 2d 高斯函数太慢了的主要内容,如果未能解决你的问题,请参考以下文章

使用带有大数据集的SciPy曲线拟合库的RuntimeError

在 seaborn displot/histplot 函数中绘制高斯拟合直方图(不是 distplot)

将高斯积分函数拟合到数据

最小化拟合高斯过程

高斯拟合代码

OpenCV高斯曲线拟合