繁体   English   中英

用于 3D 数据的 Levenberg-Marquardt 算法

[英]Levenberg-Marquardt algorithm for 3D data

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

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

您是否有使用 MATLAB 将'levenberg-marquardt'用于 3D 数据的示例数据?

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

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

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

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

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

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

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

在 MATLAB 2018a 上测试。

希望有帮助。

编辑: lsqcurvefitlsqnonlin

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM