最近用Matlab做了各种不同模型的三维数据的仿真实验 不少需要对三维数据进行拟合 matlab 自带一个拟合工具箱(cftool) 确实强大 使用工具箱做数据拟合省不少事 对数据集足够的原始模型而言 cftool能很准确的拟合出想要的结果。当然不讲Matlab 本篇通篇跟Matlab毫无关系 ~~话讲多了 下面开始。


一、数据原型

首先导入一张完整的数据表格 可以看到这是一个y=9 x=15 大小是9x15的矩阵 矩阵每个元素对应一个数值z 第二张图是在第一张图里面的数据对应位置挑出来的数据。大小是3x5的有效矩阵。

这样就在原始数据虚拟出了一个残缺度高达90%左右的数据 那后面的内插拟合就是针对这个残缺数据而做相应的计算。


二、插值拟合

1、概念导入

给你两个数 (129 192)让你在这两个数中间线性插入一个值 那插入的方式其实有很多 例如在二维平面线性 B2 =(A1+A2)/2, 或三维空间线性 用到如下。

A: 192 129

B :192 157 129

2、一阶拟合

经过上述的概念导入 接下对残缺数据进行一阶插值 参考下面公式

黑色框为有效的顶点数据 用算法遍历任意两个顶点中 只要有一个是有效数据(黑框的 这点很重要 很重要 很重要 重要的事情说三遍)插一个数据(蓝色框数据) 如行相邻的129与192两个顶点内插157 129与267两个相邻顶点内插186。结果如下图所示。

第一阶内插完了吗? 不 再看上面的数据。插完第一轮后新增相邻顶点还需要内插 由于我的数据矩阵不大 第二轮插完后我的数据已经找不到相邻空白点了。如果数据矩阵非常大 在算法实现上 这个节点的代码可以写成递归形式 直到插完才开始退栈(效果如下)。

>3、二阶拟合

的二阶拟合完全是根据一阶拟合的结果来调整的 我的二阶设计是通过四个有效顶点(黑色框框为有效顶点 重要的事情说一遍)内插一个绿框数据。AD对角 BC对角 参考如下公式

注:插完之后不执行一阶拟合 一阶是需要黑框数据支持 任意两个蓝色、绿色数据不需要。

为了好看些 我把一阶的内容拿掉 如果一阶拟合出来的结果不是我下面的模型 需要进行模型转换。具体怎么弄 自己想想看 或给我留言吧(核心私聊)。

4、三阶拟合

三阶插值跟二阶插值基本是一样的 唯一不一样的地方:任意四个顶点(不限定是否黑框) 参考上面公式插入。得到第二个图。

5、删除辅助点

最后告诉大家 上面除了黑色框框的为有效数据 其他颜色框框的为辅助数据 类似于解几何题作的辅助线。现在把他删掉吧。参考删除之后的结果如下。

6、与数据原型比较偏差

平均偏差7%最大偏差22% 相对来说拟合度挺好的 别忘了我只有10%的数据 要拟合90%的数据。

7、结果输出

8、总结

95%时间在想办法 5%的时间把办法写成代码。看完本篇 是否曲面拟合可以轻松搞定了?

(此算法是建立在对称 规则的模型基础上滴 暂未试过不规则模型的适应性)。走之前请点赞!

作者:showlo

链接:https://zhuanlan.zhihu.com/p/24275757

来源:知乎