[英]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 点云,其坐标存储在数组x
、 y
和z
。 假设您正在寻找z = exp(r1*x + r2*y)
形式的拟合曲面(不再是曲线,因为您处于 3D 中z = exp(r1*x + r2*y)
,其中r1
和r2
是要找到的系数。 您首先定义以下内联函数
fun = @(r) exp(r(1)*x + r(2)*y) - z;
其中r
是一个未知的 1x2 数组,其条目将是您的未知系数( r1
和r2
)。 我们准备解决这个问题:
r0 = [1,1]; % Initial guess for r
options = optimoptions(@lsqnonlin, 'Algorithm', 'levenberg-marquardt');
lsqnonlin(fun, r0, [], [], options)
您将在命令窗口中获得输出。
在 MATLAB 2018a 上测试。
希望有帮助。
lsqcurvefit
与lsqnonlin
lsqcurvefit
基本上是一个特例的lsqnonlin
。 关于在速度和准确性方面哪个更好的讨论范围很广,超出了本文的范围。 我建议lsqnonlin
有两个原因:
x
, y
, z
作为矩阵而不是列向量,只需确保维度匹配即可。 事实上,如果你使用lsqcurvefit
,你的fun
必须有一个额外的参数xdata
定义为[x, y]
其中x
和y
采用列形式。fun
,即f(x,y,z)=0
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.