我有一个三维的点云,它的坐标存储在三维矢量中,我想要将非线性函数拟合到点云中。
你知道在MATLAB中实现的lsqcurvefit算法是否也适用于3D数据吗?
你有没有使用MATLAB将'levenberg-marquardt'用于3D数据的示例数据?
options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');发布于 2020-02-19 23:27:17
是的,您仍然可以在3D中使用lsqcurvefit,但如果您想让代码尽可能简单(请参阅编辑),我建议使用lsqnonlin函数进行多变量非线性数据拟合。链接的文档页面显示了几个示例,其中一个在2D中使用了Levenberg-Marquardt算法。在3D或更高版本中,用法类似。
例如,假设您有一个3D点云,其坐标存储在数组x、y和z中。假设您正在寻找z = exp(r1*x + r2*y)形式的拟合曲面(不再是曲线,因为您在3D中),其中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 vs lsqnonlin
lsqcurvefit基本上是lsqnonlin的special case。关于在速度和准确性方面哪个更好的讨论是广泛的,超出了本文的范围。我建议使用lsqnonlin有两个原因
x,y,z作为矩阵而不是列向量,只要确保维度匹配即可。实际上,如果您使用lsqcurvefit,您的fun必须有一个额外的参数xdata定义为[x, y],其中x和y以列的形式获取。fun,即f(x,y,z)=0.形式
https://stackoverflow.com/questions/60270152
复制相似问题