我有一个三维点云,其坐标存储在三维向量中,我想将非线性函数拟合到点云。
你知道在MATLAB中实现的lsqcurvefit
算法是否也适用于3D数据吗?
您有使用MATLAB对3D数据使用'levenberg-marquardt'
的示例数据吗?
options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
是的,您仍然可以在3D中使用lsqcurvefit
,但如果您想让代码尽可能简单(请参阅编辑(,我建议使用lsqnonlin
函数进行多元非线性数据拟合。链接的文档页面显示了几个示例,其中一个示例在2D中使用了Levenberg-Marquardt算法。在3D或更高版本中,使用情况类似。
例如,假设您有一个三维点云,其坐标存储在阵列x
、y
和z
中。假设您正在查找形式为z = exp(r1*x + r2*y)
的拟合曲面(不再是曲线,因为您处于3D中(,其中r1
和r2
是要查找的系数。首先定义以下内联函数
fun = @(r) exp(r(1)*x + r(2)*y) - z;
其中CCD_ 11是未知的1x2阵列,其条目将是您的未知系数(r1
和r2
(。我们已经准备好解决这个问题:
r0 = [1,1]; % Initial guess for r
options = optimoptions(@lsqnonlin, 'Algorithm', 'levenberg-marquardt');
lsqnonlin(fun, r0, [], [], options)
您将在命令窗口中获得输出。
在MATLAB 2018a上测试。
希望能有所帮助。
编辑:lsqcurvefit
与lsqnonlin
CCD_ 16基本上是CCD_ 17的一个特例。关于速度和准确性哪一个更好的讨论范围很广,超出了本帖子的范围。我建议lsqnonlin
的原因有两个:
- 您可以将
x
、y
、z
作为矩阵,而不是列向量,只需确保维度匹配即可。事实上,如果使用lsqcurvefit
,则fun
必须有一个定义为[x, y]
的附加参数xdata
,其中x
和y
采用列形式 - 您可以自由地选择您的拟合函数
fun
为隐式,即形式为f(x,y,z)=0