三维数据的Levenberg-Marquardt算法



我有一个三维点云,其坐标存储在三维向量中,我想将非线性函数拟合到点云。

你知道在MATLAB中实现的lsqcurvefit算法是否也适用于3D数据吗?

您有使用MATLAB对3D数据使用'levenberg-marquardt'的示例数据吗?

options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');

是的,您仍然可以在3D中使用lsqcurvefit,但如果您想让代码尽可能简单(请参阅编辑(,我建议使用lsqnonlin函数进行多元非线性数据拟合。链接的文档页面显示了几个示例,其中一个示例在2D中使用了Levenberg-Marquardt算法。在3D或更高版本中,使用情况类似。

例如,假设您有一个三维点云,其坐标存储在阵列xyz中。假设您正在查找形式为z = exp(r1*x + r2*y)的拟合曲面(不再是曲线,因为您处于3D中(,其中r1r2是要查找的系数。首先定义以下内联函数

fun = @(r) exp(r(1)*x + r(2)*y) - z;

其中CCD_ 11是未知的1x2阵列,其条目将是您的未知系数(r1r2(。我们已经准备好解决这个问题:

r0 = [1,1]; % Initial guess for r
options = optimoptions(@lsqnonlin, 'Algorithm', 'levenberg-marquardt');
lsqnonlin(fun, r0, [], [], options)

您将在命令窗口中获得输出。

在MATLAB 2018a上测试。

希望能有所帮助。

编辑:lsqcurvefitlsqnonlin

CCD_ 16基本上是CCD_ 17的一个特例。关于速度和准确性哪一个更好的讨论范围很广,超出了本帖子的范围。我建议lsqnonlin的原因有两个:

  • 您可以将xyz作为矩阵,而不是列向量,只需确保维度匹配即可。事实上,如果使用lsqcurvefit,则fun必须有一个定义为[x, y]的附加参数xdata,其中xy采用列形式
  • 您可以自由地选择您的拟合函数fun为隐式,即形式为f(x,y,z)=0

最新更新