首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三维数据的Levenberg-Marquardt算法

三维数据的Levenberg-Marquardt算法
EN

Stack Overflow用户
提问于 2020-02-18 04:45:20
回答 1查看 371关注 0票数 1

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

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

你有没有使用MATLAB将'levenberg-marquardt'用于3D数据的示例数据?

代码语言:javascript
复制
options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
EN

回答 1

Stack Overflow用户

发布于 2020-02-19 23:27:17

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

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

代码语言:javascript
复制
fun = @(r) exp(r(1)*x + r(2)*y) - z;

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

代码语言:javascript
复制
r0 = [1,1]; % Initial guess for r
options = optimoptions(@lsqnonlin, 'Algorithm', 'levenberg-marquardt');
lsqnonlin(fun, r0, [], [], options)

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

在MATLAB 2018a上进行了测试。

希望这能有所帮助。

编辑:lsqcurvefit vs lsqnonlin

lsqcurvefit基本上是lsqnonlinspecial case。关于在速度和准确性方面哪个更好的讨论是广泛的,超出了本文的范围。我建议使用lsqnonlin有两个原因

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

形式

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60270152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档