图片缩略图

使用网格拟合曲面

版本1.1.0.0 (2.56 MB 约翰D 'Errico
用分散的数据建立二维曲面模型

113下载

更新2016年3月04日

查看许可协议

编者按:受欢迎的文件2008

此文件被选为MATLAB Central本周精选

那些希望从数据中建立曲面模型的人
z(x,y)的形式由分散或半分散
数据在matlab中有很少的选项-主要
griddata。
网格数据是一种有价值的插值工具
分散的数据。然而,如果有,它就失败了
复制或当数据有多个共线时
点。Griddata也无法推断
超出了数据的凸包,除非v4
使用选项,速度较慢。
Gridfit解决了所有这些问题,尽管它
不是插值函数。它在一个
完备的点阵,外推顺利进入
角落。你可以控制数量
平滑完成,以及插值方法,
使用哪个求解器,等等。
这个版本允许用户使用新的平铺选项来解决更大的问题。现在构建的表面的大小基本上没有限制,只要您有足够密集的数据和足够的内存来存储最终的网格表面。

示例可以在gridfit_demo.m文件中找到,
以及与网格数据的比较
表面。

引用作为

John D'Errico(2021)。使用网格拟合曲面(//www.tatmou.com/matlabcentral/fileexchange/8998-surface-fitting-using-gridfit), MATLAB中央文件交换。检索

意见及评分(278

史蒂夫didienne

湍流燃烧

帕特尔穆克什

太好了,看着我分散的数据,我感到压力很大,不可能对它们进行排序,并使它们可以用于插值方法

桑杰马诺

很神奇的。花了几个小时寻找解决方案。

Perveen塞提

相对于你们的氟氯化碳,这个产品的性能似乎很好。再次感谢。

Aritra Ghosal

会偏向Kurum

qingbin孟

托马斯。

非常感谢!健壮的代码与所有选项,你可以梦想。只需在一组50GB的.xyz数据上使用它,这些数据被分割成50个文件,这取决于输出的离散化程度,您希望它运行得和市场上任何地理信息软件(GIS)一样快,甚至更快。我为完成添加了一个时间估计,以帮助用户可视化非常大的数据集所需的时间。这将是伟大的有一个代码,估计最佳瓷砖大小给xyz。现在我将贴图固定为元素x或y最大大小的10%,最大值为1000。

添加到第1019行
%==============================================
Time_estimate_x = (cputime-tx)* (nx-xtind(end))/tilesize;
tx = cputime;
disp(['Time Estimate:' num2str(time_estimate_x/3600)]'Hr /' num2str(time_estimate_x/60)“最小值”);
%==============================================

拉希德Yagoub

bkamen

优秀的功能!它解决了我的许多麻烦。非常感谢!

泰德•舒尔茨

这不仅仅是一个有用的函数。代码有很好的文档,包括一个单独的文档文件,解释了函数背后的思想!我喜欢这个函数对我的应用程序很有用,而且我可以通过阅读注释和查看代码向作者学习!

路易斯

grega

伊桑。徐

Derya Akkaynak

cgenes

杰森·尼科尔森

Masoom Kumar,当我今年夏天有机会的时候,我会上传更多关于如何使用各种类型的约束来做到这一点。

Masoom库马尔

是否有可能在拟合上应用边界?换句话说,我们能否限制上界和下界之间的拟合?

错话自己

马的操作系统

奥马尔Marello

Guangpeng严

乌玛·尚卡尔

乌玛·尚卡尔

Mahdi S. Hosseini

一个名为MaxPol的相关数值微分工具箱最近已经发布,并在这里提供
//www.tatmou.com/matlabcentral/fileexchange/63294-maxpol-smoothing-and-differentiation-package

MaxPol提供了一个框架来设计各种数值微分内核,其属性如下:
(1)无侧高程伪影的截止(低通)设计(用于抗噪声情况)
(2)任意的微分顺序
(3)任意多项式精度
(4)导数矩阵设计
(5)带转向力矩的二维导数核
(6)信号与图像处理中的直观例子

XJ_CHEN

但是,我不明白这个和maltab的函数中心中的“scatteredinterpolant”有什么区别

哥特克鲁格

如果你喜欢这个函数,你应该试试regularizeNd。这是gridfit的nD版本,有一些bug修复和改进。
//www.tatmou.com/matlabcentral/fileexchange/61436-jasonnicholson-regularizend

在保真度方程a中添加的二阶导数方程的数量存在缺陷。其结果是,在试图求解x时,向系统添加了看起来像0*x = 0的方程。因为这是一个最小二乘问题,所以这个方程不会破坏解,最终只会引起一些小问题,但这是一个缺陷。

而且,网格拟合不能缩放二阶导数方程。当一个维度的单位与另一个维度不同或尺度非常不同时,这是很重要的。在一个维度上需要的平滑参数应该是相似的,而在不同的维度尺度下,平滑参数是不网格拟合的。

恩斯特Niederleithinger

阿伦Krishnadas

约翰!这很有帮助。我从abaqus结果中导入的巨大向量很难通过griddata进行拟合。Gridfit帮助解决了这个问题。

塞巴斯蒂安Bannwarth

亲爱的约翰!真是个好工具。它极大地帮助我将网格表面贴合到分散的数据中。我想知道是否有任何机会创建一个与网格匹配的sfit对象?我实际上想做的是在某个点上对拟合曲面进行不同的处理,然后再进行积分。那么,有没有可能把表面变成一个合适的物体呢?

“国丰

斯文

约翰,像往常一样,这是一个非常有用的工具,适用于很多问题。

我想我可能会问-你能看到任何方法,周期性边界条件可以实现到网格拟合的工作?

我在一些场合遇到过这个问题,到目前为止,我只是用了一些技巧来近似周期性。例如,如果在我的数据中,我希望沿x方向周期性输出(这样网格拟合输出曲面的第一列和最后一列应该在位置和斜率上理想地相互匹配),我只是使用常规网格拟合输出,用相反几列的镜像副本填充输出,然后在删除填充添加之前对这些边缘列应用一些类似高斯的平滑。

就像我说的,它一直都是一种hack,从来都不是完美的——但是像这样的东西对于我当时的目的来说已经“足够好”了。

那么,你能评论一下在网格拟合中添加约束以匹配第一列和最后一列(或行)的位置/斜率的可行性吗?

B Verhaar

亲爱的约翰,
谢谢这个精彩的活动。我经常使用它。
它似乎有一个“隐藏的”输入参数,称为mask。它的目的是什么?
致以亲切的问候,Boudewijn Verhaar

Jianguang陈

出色的工作!

Binu

Somayeh Hesabi

pengfa周

嗨,我是一个matlab的学习者,谁能告诉我我应该把这个文件粘贴在哪里使用?万分感谢!

j b

talyn董

Natalylun

哔叽

RegularizeData3D是Jamal的一个分支,他有:
1)固定归一化问题,这样改变网格分辨率不会改变拟合的形状。
2)增加双三次插值,在某些情况下可以产生较小的差异。

遗憾的是,这两个版本都不能用于2D数据。需要一些黑客来创建一个假的三维空间,比如[0 1 0 1…]

http://au.mathworks.com/matlabcentral/fileexchange/46223-regularizedata3d

rajyalakshmi k

你好,
我有xyz值I,e .mat文件,我需要用它们重建表面,我正在使用这段代码,但得到错误,谁能建议我如何正确使用这段代码的过程。
谢谢你!

•golk

它不适用于非单调递增向量

Behailu Shikur

斯蒂芬妮

嗨!
我刚看到这个,看起来真的很棒!
我想知道这是否也适用于分段曲面,比如两个曲面相交于一点。
可能吗?
我不知道在这种情况下如何使用它。
谢谢你的帮助!

斯蒂芬妮

莱拉麦克斯韦

茱莉亚豪

这是一个很棒的工具——比griddata更有效。

我想知道是否有一种方法可以用这个代码提取拟合曲面的公式?

谢谢,

茱莉亚

张Lidong

很好

苏西阿曼

这是否创造了一个适合的公式?

Sathish Sanjeevi

yousaf obaid

阿诺德

嗨,约翰,
在使用这个非常健壮的函数多年之后,我终于偶然发现了一个我自己也无法回答的问题,那就是如何使用加权点。由于这没有实现,我想知道这里是否有人能给我指出一个替代方案。
马提亚斯三月份在忙什么?

亲切的问候
阿诺德

Eugenio

我经常使用它,谢谢你的工作

DAIRC

彼得罗

罗伯•坎贝尔

丹尼尔·佩雷斯

你好,
当使用梯度调整器时,为什么会这样
文档文件说网格拟合试图迫使“第一个”偏导数在一个节点附近相等?当我看代码时,在我看来,它迫使每个单元格周围的第二个偏导数等于0。不完全像拉普拉斯方法,但仍然涉及二阶导数。

代码中,我看到梯度调整器下的二阶导数:
-2. /(₁。*(₁+ dy2)), 2. /(₁。* dy2), -2. / (dy2 *(₁+ dy2)。

Jan Mervart

了不起的工作!

Henry1993x

Wrichik巴苏

马蒂亚斯

我尝试自己实现一个加权版本。我将“Normal”求解器(网格拟合线631)中的Normal方程替换为加权等效

zgrid =重塑((A'*W*A)\(A'*W*rhs),ny,nx);

其中W是一个对角线矩阵,其权重在对角线的第一个nPoints项上,其余的nPoints项上。权重是标准化的,所以它们和为nPoints。这种方法合理吗?

马蒂亚斯

非常感谢您使这个伟大的功能可用!

我希望能够对不同的数据点应用不同的权重,我想知道是否有一种严格的方法来做到这一点。我想我可以根据它们的权重创建数据点的副本,但这似乎是一个不优雅的解决方案。

谢谢!

萨玛

有人能帮助解决这个错误吗?
未定义的函数'sparse'用于类型为'single'的输入参数。谢谢。

Binu

马太福音

一如既往地服从,约翰。谢谢。

下面已经问了,但你能把双立方插值到这个提交?

请:-)

乔治•

艾丽卡

bigtoelee

嘿,非常感谢你的代码。
我有一个问题:
我的2d数据已经在矩阵中格式化,我必须将它们转换成列才能使用该函数吗?

MaLe92

好的,谢谢。

约翰D 'Errico

网格拟合的结果本质上是一条样条。这就是它,一个分段函数。分段函数没有f(x,y)这种形式的简单表示。在最好的情况下,您可以以调用interp2的形式编写该求值,因为gridfit返回的是您在矩形点数组上的函数。

找到f(x,y)这种形式的一般函数,并把它写成可以写在论文里的形式,这是一个很难用计算机(自动地)解决的问题。这样的函数通常是x和y的非线性函数,它将涉及必须估计的参数。要做到这一点,首先需要确定一个非线性模型,然后使用非线性估计工具来确定参数。这些都不适合,也不可能适合。

MaLe92

嘿,:)非常感谢这段代码。

我还有一个问题:
是否有可能确定生成的曲面为函数z=f(x,y)?

我找不到信息(或我不理解信息;))。

约翰D 'Errico

据我所知,没有其他实现是免费的。我听说过有人问是否可以用其他语言来编写,但我还没有看到任何实现。这并不是说没有人写过,只是他们可能选择不让它出现在公共领域。考虑到让它工作可能需要一些努力,我不会责怪那些编写了这样的代码但自己保留它的人。例如,我很久以前就写过这个的n维版本,但那个代码属于我以前的雇主。

杰罗德·柯林斯

这段代码很棒。我想知道,有没有一个c++或VTK的实现?

约翰D 'Errico

将网格配合产生的表面想象成一个适度柔性的板,在那里我们可以控制整体的柔性。现在,将弹簧连接到板上,将板连接到每个数据点。弹簧具有这样的性质弹簧中储存的势能与延伸的平方成正比,这是一种最小二乘。延长一倍,弹簧中储存的能量就乘以4。弹簧被设计成只在z方向储存能量。

平滑参数的基本思想是,我们可以调整板的弹性相对于弹簧常数的连接。所以如果我们让弹簧更强,那么它们就会使板的形状更扭曲。使弹簧很弱,那么板就会接近一个平面。

GdogCdog

优秀的代码-快速和工作直接从盒子!你还能要求什么呢?

有一个问题,你能解释一下平滑参数是如何工作的吗?我已经调整以获得预期的结果,但想要了解,并能够向其他人解释更多一点关于这是如何工作的。

谢谢!

Junghwan

谢谢你的好代码。
我和贾乐毅有同样的要求。
它在数据上展开并填满整个矩形区域。有办法阻止它扩散吗?

约翰•波特

我已经使用这个程序很多年了,它工作得很好!有人尝试过用Matlab Coder将gridfit转换为C吗?

约翰D 'Errico

网格拟合不是插值工具。如果你想这样做,可以使用griddata、triscatteredInterp、scatteredInterpolant等工具。

贾乐毅

约翰,谢谢你的密码。然而,有没有一种方法,使刚刚插值坐标,我输入没有'扩展'属性?

谢谢你!
嘉乐

贾乐毅

约翰陈

代码是很好的工具,讨论也很有帮助。我已经运行了演示,结果非常令人印象深刻。
我注意到你有另一个工具箱,可以把曲面贴合到球坐标上。你能给我发一份吗?

非常感谢!

尼尔。

非常感谢。我非常感激。

尼尔。

约翰D 'Errico

不管z0的值是多少,这里都没问题。

你可以把它看成是截断的泰勒展开,它本质上就是这样。我只是选择了一条直线,它与断点处log函数的斜率和值相匹配,以创建一个连续的、可微的函数,它将线性外推。这也是条样条。

尼尔。

谢谢你,约翰;你的建议奏效了。我选择Z0为我拟合的数据中2E12的max(Z)的0.5%。现在,使用网格拟合来拟合有条件的对数转换数据,得到一个不会超调的正曲面。

一个问题:你如何得到变换的第二部分,即((z - z0)/z0 + log(z0)).*(z>z0)?它起作用了,但我不知道为什么。(对数的泰勒展开?)

谢谢,
尼尔。

约翰D 'Errico

尼尔,

当然,我的回答应该是——挑食、挑食、挑食!

我猜这是对数变换的结果。你可以使用'springs'方法作为正则化器来避免这种情况,但这可能太极端了。

所以另一种方法是使用分段变换。因此,选择一些断点,在此断点之上,转换将是线性的,在此断点之下,它将表现为对数转换。我称它为z0。我们可以把变换函数W(z)写成

W = @ (z, z0)日志(z)。* (z < = z0) + ((z - z0) / z0 +日志(z0)) * (z > z0);

您可以绘制它,例如选择z0=3作为断点。

ezplot (@ (z) W (z, 3))

当然,这个变换是可逆的。这应该可以工作:

z0 Winv = @ (w) exp (w)。* (w < =日志(z0)) + z0 * (w -日志(z0) + 1)。* (w >日志(z0));

同样,我们可以把它画出来,在这里z0 = 3,如下所示:

ezplot (@ (w) Winv (w, 3))

像这样的东西会给你最好的结果,你所需要做的就是为z0选择一个对你有意义的值。我可以从z的均值开始取z0。

尼尔。

嗨,约翰。感谢关于使用日志转换的提示。这似乎是一个明智的方法,我试过了。拟合表面现在都是积极的,正如预期的那样。然而,它也超调了:在拟合曲面上的最高峰值(Z)现在是最大数据点的3倍。在此之前,拟合程度与数据密切相关。

我要补充的是,数据中确实有0,我不想完全删除它们,因为它们代表了我拟合的稀疏数据的边界条件;例如,光谱在某一能量(如E=0)或某一角度消失。相反,正如你所建议的,我用一个小数字替换了0;我试过1E-10, 1E-5, 1E-1和1。在所有情况下都出现了超调,可能与数据中存在0或小数字无关。

我尝试在对数变换之前和之后附上拟合曲面的图片,但在这个论坛上似乎没有办法做到这一点。

谢谢,
尼尔。

约翰D 'Errico

尼尔,答案是肯定的,也不是。也有可能恰恰相反。

不,通过内部变化使网格拟合工作是困难的,因为这将是一个相当大规模线性代数问题的约束。因此,虽然理论上我可以使用lsqnonneg或lsqlin之类的工具来代替反斜杠来求解,但在任何合理大小的问题上都要花很长时间才能结束。

无论如何,有一个解决方案将为您工作,而且相当简单。通常情况下,由于物理问题,在0处有一个边界约束这是因为问题真的应该进行转换,使其更线性。逻辑变换是一个对数变换。因此,不是拟合Z作为X和Y的函数,而是拟合log(Z)作为X和Y的函数的曲面,显然不再有任何负问题,因为要恢复你真正想要的曲面,你只需要简单地求指数。

如果您确实有任何数据点是精确的零,那么最好完全放弃它们。或者,您可以用一些较小的数字替换它们,但这将导致问题不那么顺利,并可能在表面引入错误。当然,非光滑区域的对数会非常负,所以求幂后,它基本上是零。所以两种方法都适用于这些精确的0。

我希望对数变换的思想能解决你的问题。这是我经常使用并取得成功的方法。

尼尔。

感谢您提供此代码。是否有一种方法来调整它,以增加额外的约束,拟合曲面也应该总是正的?我拟合的X,Y,Z数据表示光谱(Z) vs能量(Y)和角度(X),因此,负Z是非物理的。

谢谢,
尼尔。

达林

不仅是一个伟大的工具,源代码和这里的讨论是一个伟大的教育。约翰,谢谢你提供的文档和例子

它通常能满足我所有的需求。当真正奇怪的需求出现时,这是一个很好的开始。清晰且结构良好的代码。

约翰D 'Errico

当然,对于Chad来说,简单的答案是在gridfit上放置一个基本的包装器,它可以测试数据,并提前将其与节点进行比较。如果没有选择节点来包含数据,则将其修复为包含数据。这时不需要生成任何警告。然后让包装器代码将所有参数传递给gridfit。

约翰D 'Errico

我(或您)可以按照Chad的建议更改代码。就我个人而言,我不认为这是一个好主意,因为gridfit会追加新的节点,在发现这种情况时扩展网格。这意味着作为数组的网格的大小不再像您可能期望的那样,因此警告似乎是值得的。即使节点在没有告诉你的情况下被移动了,我认为什么都不说是个坏主意。

就像现在一样,如果你真的不想要警告,那么你可以关闭警告。这是'extend'参数的一个文档选项。从本质上讲,正如我现在所写的那样,如果代码对网格做了一些与您期望的不同的事情,它将生成一个警告,除非您告诉它不要生成警告。我只是不喜欢模糊的警告,当它遇到一些令人惊讶的事情时,它可能会产生警告,也可能不会产生警告。

乍得格林

我的xnode和ynode通常相距约1 km,但如果gridfit需要在任何方向上将域扩展1纳米,它就会给出警告消息。我建议添加一个子句,将警告限制在域扩展超过dx或dy的一半的情况下。扩展语句有四种可能的警告情况。我建议的警告从句是这样的:

例“警告”
如果xmin < xnodes (1) abs(平均(dx) / 2)
警告('GRIDFIT:extend',['xnodes(1) was reduced by: ',num2str(xnodes(1)-xmin),', new node = ',num2str(xmin)])
结束
Xnodes (1) = xmin;

类似地,对于其他三个警告,if语句将是

如果xmin > xnodes (1) + abs(平均(dx) / 2)
如果ymin < ynodes (1) abs(平均(dy) / 2)
如果ymax > ynodes(结束)+ abs(平均(dy) / 2)

朱迪思

这是一个奇妙的函数,它与我的2d数据完美地运行。你也提供gridfit3d版本吗?这样可以为我的后期处理工作节省很多时间。提前谢谢你。

Chaipichit

如何在研究论文中引用你的代码?

约翰D 'Errico

Evgheny -如果你真的需要在球坐标中适合这样一个表面,我可能可以帮助你一个单独的,未张贴的工具箱,能够在球坐标中适合一个表面。你需要直接联系我。

Evgheny

谢谢,函数做它的工作很棒!

有人知道这个函数对于封闭曲面(类球面)的替代方法吗?
如果我用球坐标尝试这个函数,它工作得很好,但是接缝(关节线)有问题。

约翰D 'Errico

对不起。我从未听说过Java实现。这不算,我用MATLAB写了7次,每一次都是用Fortran和APL写的,最后的那些都很老了。每次的不同都是我从之前的化身中学到的。如果有人要做Java实现,也许最重要的事情是使用稀疏线性代数功能来求解,否则就会花很长时间。

behruz

在java中有实现吗?得到一些点,位置和值,然后给出grdi?

亚历克斯

只是把我的0.02美元加到整个球体的讨论中。根据函数的数学定义每个x只有一个F(x)如果存在多个F(x) x与F(x)之间的关系不是一个函数。

Klont

我希望我可以删除我之前的问题,谷歌上的2秒指向我的Matlab的interp2,我现在正在使用它来输出您出色的网格拟合。谢谢分享!

Klont

我发现使用网格拟合将一个漂亮的表面拟合到大约55个数据点是非常简单的。我在想,有没有办法得到不在节点上的曲面的值?我希望用曲面在55个样本之间进行插值。

Klont

约翰D 'Errico

对于那些不明白为什么Felon的评论是愚蠢的人,可以这样想。网格拟合在矩形网格上拟合一个f(x,y)形式的曲面。正如许多人多年来发现的那样,它在这方面做得相当好。

虽然你可能认为一个球体的表面是一个表面,但它不是网格拟合所能拟合的形式。它是多值的,因此对于任何单个(x,y)对,将有0、1或2个适用的z值。同样,这个“曲面”(更好的说法是流形)具有导数奇点,如果我们将其视为x和y的函数。因此,即使是一个半球对这个工具来说也是有问题的。

你不会使用网格拟合来拟合一个不能在矩形网格上表示为两个变量的函数的东西,就像你不会期望它做数值积分、数值优化或计算FFT一样。你也不会指望它为你做饭、洗衣服等等。使用正确的工具来解决你的问题,但如果你试图用错误的工具来解决一个随机的问题,就会有糟糕的结果,不要抱怨你得到了什么。

约翰D 'Errico

重罪犯,

所以你是在使用一个工具来构建一个单值函数来适应一些显然不是的东西。你还指望什么?魔法吗?

软件做它被编程要做的事情。当你给它一个完全不同类型的问题时,它不会神奇地重写自己。事实上,我不明白为什么你会贬低一个工具,因为它不能解决一类明确不是设计用来解决的问题。

如果你有一个闭合流形,比如一个球或其他多值形式,那么不要使用这个工具。我从未声称它能解决这个问题。相反,你可以使用像凸壳、alpha形状、CRUST等工具。或者,你可以选择将问题转换为球坐标,在这一点上,网格拟合将能够构建一个可行的表面。

又或者你只是想抱怨,没有什么好理由。

Highman领域

但它仍然无法让一群点表面看起来像一个球。其结果是插值总是一个单值函数曲面。

Highman领域

安吉洛Tafuni

约翰D 'Errico

不,gridfit没有明确地允许你应用导数约束。这并不是说这是不可能的,只是我没有把它作为一种选择。

主要原因是,它需要一组线性不等式对未知数的约束。对于一个大小为100x100的常见网格,有100*100=10000个未知数需要求解。这不是问题,因为线性系统是稀疏系统。然而,要求解一个稀疏线性不等式约束系统,就需要使用LSQLIN或类似的求解器。上次我检查的时候,LSQLIN还没有建立起来来处理稀疏的大规模不等式约束问题。(这一点可能在最近的版本中有所改变,但我还没有核实。)如果我让所有的矩阵都是满的,求解的时间可能会非常慢并且占用内存。

所以我很抱歉,但是gridfit不能解决这个问题。

如果您愿意构建一个相当粗糙的网格,并添加约束系统,那么在合理的时间内可能是可行的。我不知道网格需要多小才能使求解时间合理。你对合理的定义肯定和我的不同,这取决于你有多需要答案。

哈维尔

嘿,约翰,网格拟合是否允许我在给定的数据范围内约束拟合曲面的斜率?

我需要用分散的数据点建立一个z(x,y)形式的曲面模型,同时保持z在两个方向上的一阶导数为负。

我试图使一个表面近似来描述所需的输入扭矩驱动液压马达在一定的负载条件下运行。我的输入是:输出流量,输出压力和输入轴转速。我有分散的测量数据,这些变量之间的关系是可以找到的。我在之前的一些文章中读到,网格拟合可以扩展到更高维度的拟合。你有没有可以包含三维空间的版本,我可以试试?

贾马尔

Gridfit非常好。我写了一个更新,增加了双三次插值和改善内部缩放(使表面平滑完全独立于x/y网格大小)。如果我把代码发给你,你会更新Gridfit吗?

乔恩·格里菲思

约翰D 'Errico

Alejandro -虽然我希望在未来的某一天实现这种功能,但在我找到时间之前,这一天可能还很遥远。在那之前,我所能提供的就是使用一个更好的网格,它将模拟一个更高阶的插值器。

约翰D 'Errico

多米尼克-抱歉,不行。你可以使用这个工具来生成一个网格曲面,然后使用interp2来插值,但是如果你只想插值几个分散的点,那可能就太多了。

杜米尼克


我想知道,这段代码也可以像插补器一样使用(例如网格插补器),即输出不是网格上的平滑函数,而是在某些查询点上?

亚历杭德罗Arrizabalaga

伟大的功能!
我只是想知道:将它扩展到三次插值会很难吗?(它在代码中作为未来的增强提到)。

罗马Voronov

罗马Voronov

正是我想要的,帮助可以从一个更简单的例子开始:
[X,Y] = meshgrid(1:5);
Zsmooth = gridfit(X,Y,A,1:5,1:5,'smooth',10)
Zsmooth =
0.9638 1.9517 2.9512 3.9517 4.9638
1.9517 2.8162 3.7338 4.8162 5.9517
2.9512 3.7338 4.5266 5.7338 6.9512
3.9517 4.8162 5.7338 6.8162 7.9517
4.9638 5.9517 6.9512 7.9517 8.9638

约翰D 'Errico

Andrew -听起来你的目标是在数据范围内的区域内重现曲面的局部形状。Gridfit可以做到这一点,如果您愿意扩展网格,使其完全包含数据。简单地添加一些节点,扩展到数据的x和y的边界。网格拟合使用的节点不需要等距,所以这应该不是一个问题,但为了保持表面的基本形状,您可能需要在每个方向上添加一些这样的节点。一旦获得了拟合,那么您就可以始终只提取您希望保留的那部分表面。

如果这不是你所寻找的,那么请直接与我联系,也许可以提供一些数据,以便我更好地了解您的问题。

安德鲁

这是一个很棒的项目。我有一个问题。我有一个分散的纬度(Y)和经度(X)坐标网格,对应于亮度(Z)值。我一直在使用GRIDDATA插值到一个新的网格,该网格不是分散的,而且在较小的纬度和经度值范围内,但是GRIDDATA使数据变得非常平滑,以至于它变得无用。

我知道GRIDFIT不是一个插值器,从我对帮助的阅读来看,它似乎不是以这种方式使用的,但我只是想确定一下。

约翰D 'Errico

科林-你想要的本质上是一个三维版本的网格fit,可以使用时间作为第三维。抱歉,但也许有一天…

约翰D 'Errico

是的,网格拟合可以扩展到更高的维度。在实践中,它往往会变成一个内存和cpu占用。5维或6维是我以前做过的最实际的情况,尽管从那时起计算机变得更大更快了。64位MATLAB和大量的RAM在这里会有所帮助,但即使这样,维数的诅咒也是巨大的,而且很快就会到来。遗憾的是,我多年前写的n-d版本不是我的,不能泄露。

Atul炉火

是否有可能扩展这个想法,使3d体积适用于分散的数据,一般来说,适用于更高的维度?我能看到的唯一限制是矩阵的大小。

科林

优秀的代码,使我的生活更容易。

如果你知道你的表面在时间上的演变,你会如何建议结合之前状态的知识来帮助改进当前状态的插值/外推?

谢谢

科林

约翰D 'Errico

Laura,我确实有一个工具(基于与gridfit相同的理念)来处理非矩形域的拟合。这组工具还可以测试一般域内的点,尽管inpolygon可以在二维中处理这个问题。虽然代码功能齐全,但我还没有发布,因为我对整个工具集一直不够满意。如果你想试试,可以给我发电子邮件。

劳拉

我最近(今天)提交了一个题为“非单调分散数据上二维插值的可用解”的问题。金宝搏官方网站就在我发现网格fit之后。
非常感谢这样的套路,真的很扎实,并与我正在寻找的最佳合身!

然而,我想问一个已经部分解决的问题。事实上,我最感兴趣的是它所执行的良好插值(尽管不是客观的)而不是外推。我的xy数据点并没有定义一个方形域,而是一个扭曲的“梯形”,具有弯曲的轮廓。我想摆脱的数据,原来的领域。
Ignacio提出了一种有趣的方法(可能不是很干净,但有效)来知道哪些点在域内或域外。但我不能把它应用到我的例子中,因为这些凸边界,德劳内三角剖分在那里产生了伪三角形,确实超出了定义域。

你能建议我用什么方法来识别我的“方盒网格”的哪些点实际上落在梯形域中吗?

非常感谢

约翰D 'Errico

布鲁诺-这里有几个问题需要注意。

首先,如果你想找到严格地大于零小于曲面的面积,如果曲面小于零就要小心。(有些人忽略了这一点,但这是至关重要的。)您可以通过调用trapz(trapz(max(0,Z)))来简单地计算面积。这当然是一个近似值,忽略了一个微妙的问题,即表面在哪里经过零度以下。

接下来,根据表面的插值方式,如果你想要该体积的精确积分,那么要小心。对于一阶张量积曲面,即interp2称为“线性”的曲面,或在网格拟合中称为“双线性”的曲面,则在点格中每个单元格的中心进行插值就足够了。把这些值加起来,你就会得到一个确切的体积。(请注意按每个维度的单元格宽度缩放此结果。)正如所指出的,trapz(调用两次,所以在每个维度中调用一次)在这里也是精确的。结果证明,仅仅计算每个单元格的平均值也等价于该行为,然后将晶格中每个单元格的体积相加。

对于三角形面表面,trapz是不精确的,但差异可能是微妙的。在这里,我们最终得到了晶格中正方形单元格每个角的值的加权线性组合,但4个角的权重并不相等。给我发一封电子邮件,我可以更清楚地详细说明如何做到这一点。

实际上,简单的答案是使用trapz,但是您不应该忽略我所指出的这些微妙之处。

IainIsm

约翰,谢谢你,“springs”似乎起作用了!

Bruno -你可以使用trapz两次:http://blogs.mathworks.com/loren/2011/06/13/calculating-the-area-under-a-surface/

布鲁诺

优秀的工作。我有一个问题…如何计算插值曲面下平面xy上方的体积?也许这是一个简单的任务,但我不知道它是如何完成的。

约翰D 'Errico

IainIsm -你不能(轻易地)对这个匹配设置约束。这将导致一个非常大范围的约束拟合。虽然理论上可以用二次编程工具或lsqlin实现,但这些问题是巨大的。这太费时间了。

话虽如此,还是有一个可行的解决方案。选择“springs”正则化器作为一个选项。这个选项旨在尽可能避免外推,所以如果你的数据永远不会变成负数,那么表面也不会变成负数。

约翰

IainIsm

可爱的函数-只有一个问题,是否可以对zgrid的取值范围进行限制?例如,我使用这个来创建一个电机rpm/扭矩/效率映射的表面(然后我用interp2查询,以提供给定速度和负载的效率估计),但时不时地我发现一些zgrid值是负的。我可以使用find将这些设置为零,但我希望找到(!)一些更优雅的东西!

家务

Rijk

杰西

约旦Malof

伟大的东西!此外,令人耳目一新的是,它“开箱即用”。谢谢你约翰!

跳跃

杰克

约翰,

非常感谢。我不仅喜欢这段出色的代码,还喜欢你各种刺激和有趣的回答。感谢你用至少5分钟的令人愉快的修辞和特别的引用(马克·吐温/上帝和小绿苹果)打断了我的一天……辉煌!有一些额外的星星。

杰克

K E

可爱的,谢谢

太棒了。轻松解决我的问题!

冈萨洛

彼得

哦。在我上面的解释中,P = 1/根号2,而不是根号2。

彼得

拉尼斯,约翰等人。

这就是如何在不同的网格大小下获得一致的行为。

--------

保存gridfit的副本。M到gridfit2.m。

在gridfit2。m在注释掉的代码的位置(在第550-600行附近)做以下更改:

对不起,约翰。
% dy1 = dy(j(:)-1)/params.yscale;
% dy2 = dy(j(:))/params.yscale;
Dy1 = dy(j(:)-1);
Dy2 = dy(j(:));


对不起,约翰。
将正则子附加到插值方程,
首先解决问题。使用1范数来表示速度。
%NA =范数(A,1);
%NR =范数(Areg,1);
%A = [A;Areg*(smoothparam*NA/NR)];
FidelityEquationCount = size(A, 1);
RegularizerEquationCount = nx * (ny - 2) + ny * (nx - 2);
NewSmoothParam = smoothparam * sqrt(FidelityEquationCount / RegularizerEquationCount);
A = [A;张志刚*新闻媒体];

--------

运行以下脚本进行演示:

X = [0, 1.333333333, 2.666666667, 4,0,0,4,4,2];
Y = [2,2,2.1, 1.8114, 0,4,0,4,0];
Z = [0.5, 0.82, 0.4, 0.7, 0.5, 0.7, 0, 0.7, 0];

为原始的GridFit设置平滑度。如果网格大小发生变化,这种平滑会产生不一致的结果。
平滑度= 10;

设置不同间距的网格…
x_粗= linspace(0,4,11);
y_粗= x_粗;
X_fine = linspace(0,4,41);
Y_fine = x_fine;

我们在同一坐标下对每个曲面进行切片。。
他们有不同的指标,但相同的坐标1.2。
index_粗= find(y_粗== 1.2);
Index_fine = find(y_fine == 1.2);

%运行GridFit。
z_coarse = gridfit(x, y, z, x_coarse, y_coarse, 'Smoothness', Smoothness);
z_fine = gridfit(x, y, z, x_fine, y_fine, 'Smoothness', Smoothness);

尝试同样的事情与更新的GridFit。请注意,平滑度参数与
%原始的GridFit。然而,对于任何网格大小,所有平滑值的选择都应该产生一致的结果。
UpdatedGridFitSmoothness = 1;
%运行GridFit的更新版本,GridFit2。
z_roughse2 = gridfit2(x, y, z, x_coarse, y_coarse, 'interp', 'bilinear', 'Smoothness', UpdatedGridFitSmoothness);
z_fine2 = gridfit2(x, y, z, x_fine, y_fine, 'interp', 'bilinear', 'Smoothness', UpdatedGridFitSmoothness);

显示GridFit的结果…
只有当你使用非常大或非常小的平滑值时,这些线才会对齐。
子图(1,2,1)
抓住
plot(x_粗,z_粗(index_粗,:),'color', 'blue');
情节(x_fine z_fine (Index_fine:),“颜色”,“红”)
title(“来自原始GridFit的资料”);
轴([1,4,0.3,0.6]);
推迟

显示GridFit2的结果…
对于所有平滑度值,这些线具有相同的轮廓。
副图(1,2,2)
抓住
plot(x_粗,z_粗2(index_粗,:),'color', 'blue');
情节(x_fine z_fine2 (Index_fine:),“颜色”,“红”)
title(“来自更新的GridFit的配置文件”);
轴([1,4,0.3,0.6]);
推迟

彼得

拉尼斯,约翰等人。

工作原理:

GridFit是一个正则化数据集的函数。它构造了一系列线性方程,分别是“保真度方程”(输出与输入数据的匹配程度)和“平滑度方程”(曲面的二阶导数与零的接近程度)。它组装这些方程,并以一种使输出曲面的平方误差(SSE)和最小化的方式求解它们。

关键是要认识到SSE只是残差的平方之和,保真度残差的平方(SSE_F)和平滑度残差的平方(SSE_Sm)。
SSE = SSE_F + SSE_Sm

如果我们有一定数量的输入点,这就告诉我们在SSE_F中有多少项。网格点的数量(更准确地说,网格内二阶导数的数量)告诉我们SSE_Sm中有多少项。

想象一下,我们试图将这个抛物线:y = x^2拟合到我们的数据中。保真度项是某个有限值(在本例中无关紧要),例如100。因为我们用的是抛物线,二阶导数总是2。如果我们有一个网格,其中有20个平滑项,那么SSE_Sm = 20 *(2^2) = 80。

比率SSE_F / SSE_Sm = 100 / 80 = 1.25。这个比例决定了如何权衡平滑度和拟合的好坏。

现在假设我们突然把网格点的数量翻倍。现在SSE_Sm = 2 * 20 *(2^2) = 160。这意味着SSE_F / SSE_Sm = 100 / 160 = 0.625。啊哦!比例已经改变,这意味着我们的拟合将更有利于平滑比它以前!

解决这个问题的方法是通过将二阶导数乘以一个常数来减少它们的值,我们称之为P。在这个例子中,如果P =根号2,那么SSE_Sm中的各个项的值将是之前的一半。这没关系,因为它们的数量是原来的两倍。换句话说,0.5 * 2 = 1。

现在使用P, SSE_Sm = 2 * 20 * ((P * 2) ^ 2) = 80。这提供了与我们最初所拥有的相同的保真度与平滑度的平衡。

我在GridFit2中所做的稍微复杂一些,因为它还考虑了平滑度参数和保真方程的数量。我希望这能有所帮助!

约翰D 'Errico

Peter -如果你能做得更好,请随意编写自己的代码。(并不是使用1规范影响了你的问题。)

彼得

我不相信平滑度参数对于不同的网格大小产生一致的结果。我认为问题来自于1范数的使用,而不是仅仅使用保真方程和导数的数量。

这里有一个例子。

X = [0, 1.333333333, 2.666666667, 4,0,0,4,4,2];
Y = [2,2,2.1, 1.8114, 0,4,0,4,0];
Z = [0.5, 0.82, 0.4, 0.7, 0.5, 0.7, 0, 0.7, 0];

平滑度= 10;

x_粗= linspace(0,4,11);
y_粗= x_粗;
index_粗= find(y_粗== 1.2);

X_fine = linspace(0,4,41);
Y_fine = x_fine;
Index_fine = find(y_fine == 1.2);

z_coarse = gridfit(x, y, z, x_coarse, y_coarse, 'Smoothness', Smoothness);
z_fine = gridfit(x, y, z, x_fine, y_fine, 'Smoothness', Smoothness);

抓住
plot(x_粗,z_粗(index_粗,:),'color', 'blue');
情节(x_fine z_fine (Index_fine:),“颜色”,“红”)
推迟

丹尼尔

是的,Hendawi Mohamed我删除了我的数据边缘以下的点。我的数据大致被X-Y的三角形所限制,所以我使用:

女朋友= gridfit(…);
Z = griddata(…同样的限制);
N =找到(isnan (Z));

gf (N) =南;

去除完整的估计结果。当我绘制数据时,图上的点对应的是数据的面积。

约翰D 'Errico

你通常会首先决定你希望看到的结果大小,即x和y中的节点数量。然后你会选择一定数量的平滑。

我已经设置好了,所以我可以为了固定的平滑度而改变网格大小,这将对表面的整体外观产生最小的影响。例如,试试这个例子:

Xy = rand(100,2);
Z = rand(100,1);
Zgrid50 = gridfit(xy(:,1),xy(:,2),z,50,50);
Zgrid200 = gridfit(xy(:,1),xy(:,2),z,200,200);
次要情节(1、2、1)
冲浪(zgrid50)
阴影插值函数
次要情节(1、2、2)
冲浪(zgrid200)
阴影插值函数

这两个表面在性质上看起来相似,尽管第二个表面看起来没有那么锯齿状,因为它在每个维度上都是精细的4倍。正如预期的那样,这是通过使用更精细的网格所获得的结果,但需要花费一定的求解时间。从这个意义上说,对于任何给定的数据集,平滑度与网格本身的大小完全解耦(我也可以这样做)。

给定网格的选择,平滑度为1意味着与表面的整体平滑度相比,减少残差具有同等的重要性。但是,要小心,使平滑度过大或过小,这样你可能会发现从解中产生的数值伪影。浮点运算只能到此为止。

顺便说一下,一个好的经验法则是,如果你不能得到你想要的结果,平滑度在0.001到1000之间,那么我就会看看数据中是否存在根本问题。

同样,如果一个人选择通过1000个数据点来拟合一个2x2曲面,无论你选择的平滑参数有多小,你都不会得到完美的拟合,除非数据恰好完美地拟合用于在单位正方形内插值的隐式模型。(例如,张量积线性插值在任何单元格内使用a0 + a1*x + a2*y + a3*x*y的隐式局部模型。)如果你有很多数据点,那么对于一个非常粗糙的网格,模型中就没有足够的自由度。

Ianis

嗨!谢谢这个有用的功能!我需要适合分散的点添加噪音,和Gridfit处理得很好!现在,我想用不同的平滑度值和x-y-节点数来测试,以便为我的问题找到最好的参数。所以,我有一些关于“平滑度”参数的问题。您在帮助中解释了平滑度参数是“规范化”的,因此值为“1”可能会产生合理的结果。我想知道你是用哪个参数将“平滑度”值归一化的?如果我使用“梯度”或“拉普拉斯”作为正则化器,平滑度是否以同样的方式定义?
谢谢。

Ianis

约翰D 'Errico

Gridfit不是一个做二维插值的工具。请改用interp2。

人贾

如何使用网格拟合插值图像上的一组2D数据?
让所有z都等于0 ?

人贾

R

约翰,

所有我尝试过的作品质量都很好!非常感谢。我有一个你的函数目录,在我看来,它们很容易成为Matlab分发的一部分。
关于gridfit,你还想提交一个3D/ND版本吗?

罗德里戈。

凯蒂

托马斯

伟大的工作!

约翰D 'Errico

我能说什么呢?你可以有一个好的结果,或者一个更快的结果。只选一个。

事实上,网格拟合的速度非常快,在这种情况下,需要求解一个有90,000个未知数的线性系统。快速测试显示,在我的系统上只花了大约2秒钟。也许你想让我施魔法?即使是挥一挥魔杖也需要2秒钟。

杨ydF4y2Ba

嗨,这是一个很棒的节目!但它似乎非常消耗内存。我可以用相当小的维度(例如300x300)求解Zgrid点。Griddata似乎能够更快地求解一个更大的矩阵,但插值不是很好。有没有办法获得更高的分辨率?

约翰D 'Errico

默认情况下,它使用三角插值。如果阅读帮助,您将看到双线性(基于四次)插值方法是一种选项。一个比另一个好吗?一般来说,我认为如果你能看出区别,那么你的网格就太粗糙了!在任何情况下,如果你真的在发布之前阅读了帮助,在你的例子中,你可能已经尝试在调用中添加了一个更多的选项。

[zGrid, xGrid, yGrid] = gridfit(SourceData(:, 1), SourceData(:, 2), SourceData(:, 3), xNodes, yNodes, 'smoothness', 0.1,'interp','bi');

你的第二个评论是关于平滑参数的。请注意,网格拟合允许平滑惩罚函数的通用方案-拉普拉斯偏向于零。这是第二部分的和,它可以说是一些物理表面的逻辑选择。但是,请注意默认不是该方法。事实上,默认是一个方法,它确实解耦这些第二部分!!!!!!!!!!!!!!!!再次强调,阅读帮助,而不是假设你知道答案,然后根据错误的假设提出问题。

至于基于网格间距变化的最佳平滑参数,我发现对于几乎任何选择平滑参数的方法,我也可以提出它不会是最好的情况。Gridfit使用一个默认的平滑参数,这对于许多开箱即用的问题来说是“合理的”。它是最优的吗?可能不会。任何程度的真正优化都可能涉及到运行速度较慢的算法,而算法速度在这里是可取的。在gridfit中是否应该有一个自适应选项,允许用户设置它并离开,知道它将会运行得更慢,但它将始终为所有用户提供最佳结果?真正好的永远不会失败的自适应方法也很难编写。看看MATLAB中的数值积分工具(quad, quadl, quadgk等),通过仔细选择被积函数和区间,我可以很容易地使这些工具失败。

我所能建议的是将gridfit内建的设施用作计算工具。如果它在默认情况下产生的结果不完全是您想要的,那么我提供了几个旋钮,您可以进行调整。只有你知道你是否喜欢你用gridfit这样的工具创建的表面。但至少这些旋钮在那里转动,通常会产生一些让你快乐的东西。

彼得

GridFit很好,但我有几个问题。

1)插值似乎是三角形的,这导致了一些对称性问题。下面是一个示例程序来说明这一点。有人知道三角形插值(三点)比矩形插值(四点)有什么优势吗?

2)如果我改变网格间距,我还必须调整平滑度参数,否则GridFit会给出不同的结果。这似乎与GridFit建立其导数方程的方式有关。它把水平二阶导数和竖直二阶导数混合在同一个方程里。例如,如果水平方向上的残差是+0.1,垂直方向上的残差是-0.1,正则化器错误地认为该点是“完美拟合”,因为导数是加在一起的。将导数分离到单独的方程(Areg中单独的行)会更好吗?如果是这样,是否有可能对单个“平滑度”参数产生相同的结果(相同的平滑度或曲线剖面),不管使用什么网格间距?我认为这对GridFit用户来说是非常有用和方便的,这样我们就不必手动修改平滑度了。

在四个角各选四个点,在中心选一个点。。
确保所有东西都是围绕中心对称的。。
SourceData = [
0,0,0
0,1,0
1,0,0
1,1,0
0.5 0.5 1
];

创建一个4x4网格。
xNodes = linspace(0,1,4);
yNodes = xNodes;

%运行GridFit。平滑度参数对结果影响不大
%用于此演示。
[zGrid, xGrid, yGrid] = gridfit(SourceData(:, 1), SourceData(:, 2), SourceData(:, 3), xNodes, yNodes, 'smoothness', 0.1);

显示表面,以便我们能看到不对称。。
surf(xGrid, yGrid, zGrid);
包含(“x”);
ylabel (y);
zlabel (' z ');

计算不对称性。
disp(['GridFit不对称是',num2str(zGrid(2,2) - zGrid(3,2)), '.']);

约翰D 'Errico

与基于delaunay的工具相比,这肯定会有更好的性能。它们经常在边缘处显示严重的插值伪影。

至于拟合有多好,我很惊讶我没有返回残差或预测值的数组,但这很容易构建。使用interp2来计算预测值,因为从gridfit得到的结果现在是interp2将处理的一个很好的规则值。一旦你有了预测,残差很容易通过减法得到,或者你可以计算一个标准误差,等等。

马克

非常好,目前使用它来执行成像仪和万向激光指示器之间的校准。它还没有完全优化到在整个FOV上获得最佳预期性能,但已经接近了。在边缘,它比我尝试过的其他套路要好得多。有没有办法看看合身度有多好?

马克

达林

谢谢你这么好的工具。当正则化器在扩展区域上具有显著的低空间频率偏差时,试图找到一种绕过“拉入”的方法……例如,在一个具有“梯度”的高分辨高斯峰的顶部。使用高阶正则化器并没有帮助(我已经实现了一个四阶梯度):它只会给出一个在单个样本误差周围高度“皱缩”的表面。什么好主意吗?

基督教

对不起,这是一个打字错误:当我输入griddata时,我指的是gridfit。我后来发现这是一个MATLAB环境问题,与网格拟合无关。等高线图没有显示在显示器上。重启解决了这个问题。我会编辑或删除我原来的帖子,但这个论坛不允许这样做。谢谢你的快速回复。

约翰D 'Errico

谁能猜到你做错了什么?它究竟是如何失败的?你到底在做什么?你的数据是什么?为什么你说griddata输出是一个问题,在一个关于gridfit的问题中?

基督教

我试图使用网格拟合来产生一个等高线地图(功能:等高线和等高线)。MATLAB似乎可以解释surf()函数的griddata输出,但不能解释contour()。有人遇到过这个问题吗?我认为这与网格方向有关。

M. C Ertem

谢谢你! !挽救了局面。(实际上,晚上)。

嗨,约翰,
我尝试了一些更小的参数(比如平滑度为0.1),但随后我在图像中得到了波浪状的伪影图案。
我正在寻找的是一个组合:内部部分的griddata(因此根本没有涂抹),边缘部分的gridfit (griddata产生NaN的地方)。因此,尽量减少涂抹。我可以通过调优参数来实现这一点吗?非常感谢!

约翰D 'Errico

平滑参数的值越小平滑越少,尽管0作为一个值可能会导致奇点。

嗨,约翰,我有一组二维散射数据,我想在规则(1:N,1:N)晶格上有插值值。我应该使用什么参数来最小化平滑?(我需要迭代插值50+次,设置“平滑度”=1 50次会使结果图像非常模糊)。
谢谢!

羌族

嗨,约翰,
我现在得到了错误信息,但去年没有。似乎是因为代码与新的Matlab版本(2011a)不一致。也许我错了。你对此有什么想法吗?错误如下:

? ?使用==> mldivide出错
MLDIVIDE不支持一个稀疏输金宝app入和一个单一输入。

616处==>网格匹配错误
zgrid =重塑(A\rhs,ny,nx);

谢谢

斯特凡诺pasquali

嗨,约翰。
我对matlab很陌生。也许我会问一个愚蠢的问题。

我已经有了矩阵形式的数据。
典型的200 x200型。

我不能使用你的函数,因为它需要3个向量和节点…

你能帮我吗?

基本上我有这个曲面,观察的结果(沿x和y有分类变量),我期待一个单调递减的曲面…我明白了,但有一些异常值……我认为你的功能可以帮助我。

有什么建议吗?

约翰D 'Errico

Melissa - gridfit仅仅生成一个定义在一组离散节点点上的函数,在一个规则的格子上。它不会在任何一点上提供插值的预测。但你可以很容易地从网格拟合产生的表面得到预测。

在网格拟合中允许有三种插值方法。这些方法定义了gridfit在构建曲面时如何处理数据。没有什么需要你使用相同的方法来插值网格拟合时,它建立的表面。

好的事情是,一旦曲面在规则晶格上定义,我们已经有了interp2来进行二维插值,并且已经有了几个很好的方法。interp2的“线性”情况等同于gridfit中的“双线性”情况。事实证明,这也是photoshop等工具用于图像插值的方法。

您也可以使用interp2的其他方法—例如样条。或者,如果你更喜欢简单的插值,其中晶格的每个正方形被分割成一对三角形,然后在这些三角形上进行真正的线性插值,你可以在文件交换中找到我的interpns。

//www.tatmou.com/matlabcentral/fileexchange/30932

是的,你可以很容易地在网格内任意点做插值网格内任意点由网格拟合定义。

梅丽莎

这是一件了不起的作品,约翰。我佩服你高超的编程技能和知识。我有一个问题,我是否可以在曲面上求出一个点或一系列点的值?

约翰·雷纳特·纳什

优秀的工具,大大提高了我的可视化的一些摄影曝光数据。谢谢你,约翰,很高兴再次使用你的工具。

约翰·雷纳特·纳什

Januka

干得好,约翰。没有麻烦,易于使用。谢谢!

Ignacio

很好的

使用网格拟合插值的一种方法是:
-在整个网格中使用gridfit zifit=gridfit(X,Y,Z,xi,yi)
-在同一个网格中使用griddata
zidata = griddata (X, Y, Z,ξ,易)
-使用isnan了解zidata中哪些元素是NaN,并将其应用到zifit

至少对我来说是有效的
-使用isnan(griddata)来知道哪些点在原始数据中,并将其应用于用gridfit创建的点

何塞tapia

John D'Errico,谢谢你的回答。

约翰D 'Errico

你在很多地方问过这个问题。我不知道simulink是做什么的,所以金宝app我不能回答你的问题,我甚至不能确定你想要做什么。

Matt已经回答(作为回答),如果您只想在特定位置插入函数,那么interpne(从文件交换)将解决该问题。就我对你的问题所知,我相信这是正确的答案。

如果你想创建一个新的表面,进一步延伸,gridfit可以做到这一点。只需提供包含旧x和y的新坐标,但将创建一个扩展到您希望的范围的新网格。

记住,任何外推都是有风险的,试图预测未知的事情。它很少是准确的,甚至是智能的,它只和它所基于的数据一样好。如果你试图推断出一段很长的距离,不要对结果感到沮丧。

何塞tapia

你好,
我有以下问题。我有一个2d表,其中包含一些测量数据。如何在SIMULINK中使用插值-外推查找方法进行相同类型的外推,但在Matlab中。金宝app我发现“griddata”和“interp2”不能为我做这项工作。
这是我的数据的维度:
X <1x37 double>
Y <1x28 double>
Z <28x37 double>

提前谢谢你。

麦克尔-伦德

很好. .这正是我一直在寻找的

约翰D 'Errico

这是一个外推的问题,通常很难聪明地去做。我的标准回答是引用马克·吐温的话:

“在176年的时间里,密西西比河下游已经缩短了242英里。这相当于平均每年多跑一英里三分之一多一点。因此,任何一个冷静的人,只要不是瞎子或白痴,都可以看到,在旧志留纪Oölitic,也就是一百万年前的下一个11月,密西西比河下游有一百三十万英里长,像一根鱼竿一样突出在墨西哥湾上空。出于同样的原因,任何人都可以看到,七千四十二年后,密西西比河下游将只有一英里又四分之三长,开罗[伊利诺伊州]和新奥尔良将把他们的街道连在一起,在一个市长和一个共同的市议员委员会的领导下舒适地前进。科学有其迷人之处。一个人可以从如此微不足道的事实投资中获得如此大量的猜测收益。”

《密西西比河上的生活》,马克·吐温,1884年出版

关键是,外推是困难的,特别是如果你所使用的只是一个试图将它看到的数据和预测到未知的工具。matlab怎么知道0是一个特殊的数字?网格拟合如何知道可以平滑地预测超出数据范围的数据,但却止步于零?

说了这么多,你有几个选择,这两个都可能很有效。首先,你可以在网格配合中使用“弹簧”方法。它试图阻止超出你的数据的推断。有时这是正确的解决方案。尝试一下,你可能会快乐,也可能不会。这一点我不能说。

第二个选择是转换。通常情况下,当一个系统具有不能小于零的性质时,您就在错误的“空间”中工作。这里的技巧是使用转换来修复它。在这里,我可能会记录您的数据。现在,使用网格拟合来建模曲面,允许它顺利地外推,因为它希望使用默认选项。现在,求结果的指数。实际上,你已经在对数域内做了插值,然后又转换回来。你在乎对数是负的吗?当然不是。Exp是一个对所有实输入都为正的函数。 This trick often works very nicely. In effect, it is just recognizing that the interpolation is best done in the proper domain, one where your system is truly more additive.

杰森

我有分散的三维数据的膜受拉伸载荷在角落导致横向位移。我试图使用网格拟合来查看表示数据的3d曲面。问题是在边缘的网格拟合和冲浪产生的表示是非常不准确的。事实上,当数据中没有负z位移时,结果图在角落显示负值!什么好主意吗?谢谢。

约翰D 'Errico

这个曲面没有函数形式,至少除非你愿意接受像interp2这样的工具在任意点插值它。你能做的最好的就是把这个曲面看作是一个低阶的二维样条,但是作为一个样条,你所拥有的只是大量的微小的线性片段它们整齐地连接在一起。(这适用于默认方法,该方法使用规则格的三角剖分。另一种选择是双线性插值,它实际上甚至不是真正的线性,而是一种奇怪而温和的分段二次形式。)

这种方法的优点是可以拟合任何符合函数z = f(x,y)一般形式的数据集。您不需要像其他建模工具那样制定模型。但你也不能从中得到一个模型。

如果你真的想做经验建模,你需要努力建立一个模型,选择一些形式来代表你的曲面。这个模型可能是多项式的(我的polyfitn可以让你拟合),也可能是非线性的。然后,您需要使用一个能够将该模型与您的数据相匹配的工具。在文件交换中有许多这样的工具来达到这个目的,或者您可以使用曲线拟合工具箱。

Lennert

大家好!我有一个关于这个工具的问题。假设您已经通过数据拟合了一个曲面。是否有一个命令来提取该曲面的公式/函数?谢谢!

迈克尔·布朗

我只是想感谢你让我看到这个。文档是优秀的,它像广告宣传的那样工作,为我节省了几天的时间来设置和调试正则化方案,通过一些不相等间隔的热力学数据拟合一个适当光滑的表面,这些数据有错误,并且不能扩展到所需的P-T网格的所有角落。能够专注于科学而不是调试处理数据的方案是一种解脱。

托尼

对不起!
还在纠结这些问题。
谢谢你给我指了正确的方向!

约翰D 'Errico

啊。

Gridfit设置为忽略任何nan数据。所以你的问题是没有意义和不相关的,因为gridfit实际上忽略了nan数据。请参阅下面的代码片段,直接取自代码…

%也会删除任何NaN数据
x = x (:);
y = y (:);
z z = (,);
K = isnan(x) | isnan(y) | isnan(z);
如果任何(k)
x (k) = [];
y (k) = [];
z (k) = [];
结束

因此,仅仅因为不同的代码(griddata)不适合您,就给这个代码一个4星的评级似乎有点愚蠢。

如果您的目标是填充nan元素,同时保留实际数据,那么使用inpaint_nans进行插值。使用正确的工具来解决你的问题。

如果你的目标是平滑,同时也插值空(nan)数据,那么使用网格拟合。它将解决您的问题,但前提是您调用gridfit而不是griddata。

最后,如果你的问题是griddata没有像你希望的那样工作,或者你不理解griddata,那么为什么以上帝和小绿苹果的名义,你为什么要在这里问这个问题,在一个旨在评论gridfit的地方?

托尼

你好!
我有一个512x512数组z,其中~11000个点是非零,其余必须是nan !为什么下面的代码给我一个数组zgd只充满nan ?这个程序是如何处理nan的?


[xg, yg] = meshgrid(ξ,ξ);
X = 1:12 12;
Y = 1:12 12;
ZGD = griddata(x,y,z,xg,yg);

佬司罗伯特

气象气球数据做得很好!

亚历克西斯

+1票支持gridfitn;)

谢谢John提供的代码。我非常喜欢!

选秀y

亚当•查普曼

新设置“‘smoothness’,[xsmooth yssmooth]”真是天赐良机。非常感谢

约翰D 'Errico

我喜欢Adam的想法,这很容易就能写进代码。

亚当•查普曼

这很聪明,但是改变x和y的平滑程度的能力将是非常有用的

杰夫

约翰D 'Errico

我已经通过电子邮件直接回复了,但要点是我计划有一天引入gridfitn,但这需要一些时间来写,而且我在同一个列表上有很多东西要写。

大家好!是否有gridfit3d可用?我有一个三维电场数据阵列(369x551x325)在一个不规则但高度共线的网格和griddata3因此不工作。据我所知,如果网格拟合代码可以处理3d数据,那么它将是完美的。谢谢!

约翰D 'Errico

或者,如果你想要的只是一份引用,可以在这里找到FEX提交的简单引用样式:

http://matlabwiki.mathworks.com/Citing_Files_from_the_File_Exchange

约翰D 'Errico

也许我应该加上这句话……

如果你真的想要一些书面的东西,多年前我被授予了一对美国专利,关于类似的想法,它们应用于色彩建模的高维问题。Gridfit当然只适用于二维空间。

美国专利# 4992861,4941039

至少对我来说,阅读专利是我能想象到的最痛苦的消遣。

马特奥尼克里

出色的工作!我需要一个合理的外推算法来填充一些重力数据,用于垂直延拓和源深度反演。这对我来说非常有效。请允许我补充一句,这是我所见过的对Matlab代码的最好和最容易理解的帮助之一,即使对像我这样的母语不是英语的人来说也是如此。
之前有人问过关于期刊参考的问题,我没有看到你的回复。我也想知道是否有出版的东西可供参考。谢谢你!

Panagiotis

约翰,谢谢你的及时回复。

我真的需要一个只在给定的任意域内插值的工具,因为我需要在其中创建等高线,这在域边界之外是没有意义的。

你贴新工具的时候能在这里留言吗?
很多谢谢!

约翰D 'Errico

为了回答外推的问题,这里有几个问题。

Gridfit尝试优雅地外推,也就是说,它将尽可能顺利和线性地外推。这是默认模式。也可以为网格配合指定“springs”方法。这种方法试图最小限度地外推,同时仍然在整个感兴趣的领域生成解。金宝搏官方网站把这个方法看作是一个常数的外推,它可以这样做,至少是一个连续的平滑函数。

无论如何,这些方法仍然做外推。如果你绝对必须避免任何外推,让凸包之外的整个域为空,那么一个选项就是使用griddata。Griddata当然是一个插值器。它不会做平滑,因为网格拟合允许你控制。但是griddata将在凸包内部进行插值,并将外部的点作为NaN。

最后一种可能是,如果你需要做平滑,但只是在一个给定的任意域内,无论是否凸。这需要一个像gridfit这样的新工具,一个我已经写过但还没有在FEX上发布的工具,但将会这样做。

Panagiotis

有可能完全避免任何推断吗?

菲利克斯•马丁

克里斯汀。

Chamane

优秀的

乌尔里希

约翰D 'Errico

由于几个原因,使用插值后使用平滑是一个糟糕的第二选择。

网格拟合找到尽可能光滑的表面,这与数据是一致的。平滑插值后的表面并不能确保结果与数据一致。当你做表面的后验平滑时,平滑的行为现在与数据断开了。

接下来,如果您使用griddata提前插值一个曲面,您将只得到位于数据凸包内的结果。除非使用v4选项,否则Griddata不会进行外推,而且该选项对于任何重要数量的点都非常慢。根据您的目标,Gridfit可以使用几种方法进行推断。

外推是网格拟合的一个重要能力。但是,外推可以有很多不同的形式。例如,考虑一个数据集,它只是沿着数据的一个边缘略微凹下去。发布的演示有一个很好的例子。请看第二个例子,拟合一个三角曲面。沿着数据的边缘,可以看到griddata插值器生成又长又细的三角形。长而细的三角形对插值来说很糟糕,所以你会在边缘看到奇怪的插值伪影。

Gridfit允许您在数据中复制,以最小二乘的方式正确处理它们以生成曲面。尝试使用复制数据点的griddata。即使接近复制点也会在插值器中引入令人讨厌的伪影。更糟糕的是,如果你有一组共线数据点,在网格数据中使用的delaunay三角剖分通常会有问题。这对网格匹配来说根本不是问题。

最后,你可以很容易地控制网格拟合平滑的程度。

简而言之,griddata有它的目的。在一般情况下,我推荐griddata。但我绝不建议在使用griddata之后再使用平滑操作符。

使用gridfit而不是griddata然后平滑的优点是什么?

丹尼尔Arevalo

你好,约翰,这个函数真的很好,但我想知道是否可以将它用于非矩形域,其中节点只是指定为(xn,yn)对n=1,…N
谢谢你的帮助!

天使Atanasov

谢谢你,迪里科先生,让我的生活更轻松了。你写的这段代码真不错。

这个动作几乎是魔术……这是我发现的唯一一种方法,可以在非常嘈杂的仰角数据中找到我知道的表面。谢谢你的贡献。

卡尔

这太壮观了。我希望Mathworks会为你的努力付给你一些版税!

迈克尔·杜宾

J U

迈克尔乔丹

负担

哇!看起来帅呆了!我想知道是否有办法在3D散点周围适合一个表面?也许这可以用于数据,例如x,y数据对应于max(z),然后重复max(x)和max(y)?

亚历克西斯

干得好,约翰,漂亮的工具!非常可参数化,帮助您了解数据的行为方式。

有人知道如何将曲面锚定在任意给定点上吗?我想强迫表面通过一个给定的(x,y,z)锚点集,就像为这些关键点建立一个“无限”的权重,同时不改变其他“正常”点的权重……

波林黄

多功能平滑功能。

塞德里克Testaz

约翰D 'Errico

安德烈的评论有点自吹自擂,因为他实际上并没有提供以任何形式复制gridfit所做的文件交换的Matlab代码。顺便说一下,他给出的链接是一个。exe文件-小心。

当然,他的时间比较也没有意义,因为所提到的时间是针对现在已经完全过时的计算机,而且将插值代码与这类建模代码进行比较也没有意义。

最后,将插值代码转换为降低噪声的表面建模代码并不简单。我欢迎安德烈这样做,并为此目的提供MATLAB代码,如果这真的很容易的话。

安德烈Matseevskiy

例如,我的计算机花了1020秒来解决一个500x500的问题。你用的是什么老把戏?我需要5秒钟来解决500x500的问题。下载我的程序http://www.smartfills.com/Html/2D.zip。与你自己的方法比较。我自己的实际上是插值,但可以修改近似没有太多问题。
安德烈,堪察加半岛

获计算机科学

这个工具箱很好,谢谢

Anmol Agrawal

优秀的实用程序! !默认设置以最小的错误满足了我所需要的一切。

卡洛斯Adrián瓦格斯·阿奎莱拉

你好约翰:

我已经使用你的不可思议的程序几年了,在广泛的应用程序。我的问题是,你是否在科学期刊上写过任何类型的文档,例如,任何引用,也对这种超级“表面拟合”有更多的了解。任何参考都有帮助。

顺便说一句:VP使用更愚蠢的测试来“比较”GRIDDATA和GRIDFIT,正如John所说,他不会费心去阅读默认情况下前者是“线性的”,后者使用“平滑的”为1。但是,不管怎样……

亚历克斯·加德纳

V P

1.严格按照help, xi和yi是感兴趣的x节点和y节点,由MESHGRID生成。如果GRIDFIT不接受这种输入,这意味着GRIDFIT必须改进。
2.这对于与GRIDDATA进行比较也是必要的,GRIDDATA在我的示例中没有问题。
3.如果这些参数仍然不充分,并且您坚持认为我是不正确的,那么您必须在帮助中改进对xi和yi的描述,并将它们定义为MESHGRID的VALID INPUT参数。然而,这将再次意味着一种改进。
4.如果这对你来说没有说服力,看看下面的例子。如果这不是必要改进的强烈迹象,那么我必须遵循“haende khokh”的原则——这比围绕一个空鸡蛋的冷战要好得多。

Z =兰德(100);
= (1:10 0) ';
(X, Y) = meshgrid (,);
z = gridfit (X (:), Y (:), z (:), a, a);
规范(z (:) - z (:))
ans =
4.9225

约翰D 'Errico

VP的问题是他没有阅读帮助,或者显然不理解gridfit是做什么的。我建议你阅读帮助,如果你不明白你在使用什么,也许可以看看例子。我知道真正的男人不需要斯汀金的帮助。也许这就是VP所遵循的方法。

Gridfit不像griddata那样在一些随机分散的点列表上插值曲面。

网格拟合从一个完整的、规则的点格上的分散数据生成一个曲面。节点参数是他可能传递到网格中的参数。再次,阅读帮助。

V P

叫GRIDFIT有什么错?需要改进。

Z =兰德(100);
一个= 1:10 0;
(X, Y) = meshgrid (,);
好= (x 50) ^ 2 + (Y-50)。^ 2 > 100;
x = x(良好);
y = y(好);
z = z(良好);
坏= ~好;
ξ= X(坏);
易= Y(坏);
子= gridfit (x, y, z,ξ,易);
? ?在404处使用==> gridfit错误
Xnodes和ynodes必须是单调递增的

蒂姆·马文

Gassilloud雷米

如何使用极坐标网格拟合?
[th,r] = meshgrid((0:5:360)*pi/180,0:5:300);
[X,Y] = pol2cart(th,r);
Z = griddata (x, y, Z, x, y);

谢谢你!
雷米

约翰D 'Errico

恩里克-我猜你打电话给gridfit没有任何争论。这段代码不是gui或命令。有关使用此代码的示例,请参阅演示。它确实有效,至少在使用数据调用时是这样。约翰

恩里克·门德斯

根本没用!Matlab说:
“? ?输入参数“x”未定义。
在==>网格匹配325错误
x = x(:);“
我试图将x(:)更改为x(:,1),但问题仍然存在。我的Matlab是第7版。必须是最近的吗?

达伦·佩吉特

谢谢堆的功能,它节省了我很多工作。表面贴合已经取得了长足的进步!完全符合我的数据。而且非常容易使用。

Hendawi穆罕默德

我只是想说……“谢谢你”!

PS.但我补充:如果有一种方法可以避开超出数据点边界的网格节点外推,那就太完美了。它应该被添加到matlab下一个版本!

胡安佩雷斯

gabriele flauti

大卫·撒

伟大的工具和富有洞察力的文档!Gridfit在griddata失败的地方成功了;也就是说,在现实世界中存在的有噪声和不合理间隔的数据。谢谢!

肯林

谢谢你的节目。它现在解决了我的问题:)
顺便问一下,你愿意像冲浪者一样找出一些插值数据的方法吗

新王

这是非常非常好的工作!

E Farhi

这简直太棒了,我们可以期待griddata的所有替代品(griddata经常失败)。

卡洛斯Adrián瓦格斯·阿奎莱拉

非常非常好,约翰!好好照顾艾米!

托马斯•克拉克

功能很好,约翰,这对我来说非常有用。

不过,关闭超出数据范围的外推的能力将非常有用。

对于没有经验的用户,请注意:
如果有重复(具有相同(x,y)但不同(z)的多个点),该算法将处理griddata可能落在哪里。在这种情况下,仔细想想为什么你会有这些重复;体积绘图可能比平面绘图更合适。如果是这样,你就可以用这个算法得到一个漂亮的曲面;这完全没有意义。

这不是这个算法的错误;这只是意味着你必须认真思考为什么你在Z中得到重复的点:如果将这些点平均到一个表面是可以接受的,那么这个算法就是为你准备的!

Phani Ivatury

优秀的! !

沃尔夫冈Schwanghart

太好了!这正是我要找的。非常感谢您的巨大贡献。

克里斯托弗Schwalm

优秀的程序和文档。

一个问题:帮助说明“Gridfit不是插值器。”为什么呢?考虑到输出以及它们是如何产生的,它似乎完全可以这样使用。在我的工作中,我看到的一种用法是使用这个函数在出现重复值的地方进行插值。我还没有找到另一个Matlab解决方案,工作得很好。

约翰D 'Errico

我会邀请Håvard Torpe通过电子邮件与我联系,讨论这个想法。但是,虽然我可以允许用户在网格拟合中关闭外推,但这可能会导致奇点——对大多数可能这样做的用户来说,这是严重的数值问题。

哈佛Torpe

从你开始使用它的那一刻起,它就像一个魅力。

然而:我想用gridfit() NOT来推断附近没有数据点的网格节点的值。什么好主意吗?

安迪Lulham

谢谢你!

不可思议的!

Aslak Grinsted

应该包含在matlab的默认发行版中!也许以某种方式集成到griddata中?

温宋子文

做得很好!

T O

出色的工作!

凯文·丹尼斯

大卫•巴克

这是一个很好的项目。它使曲面与3D数据的拟合变得容易。

胡里奥·奥利维拉

太棒了!谢谢你!

CASTRY阿伦

谢谢你!

香港Zuor

做得好,约翰,我一直在寻找这个前一段时间,我认为这是一个必须有代码。非常感谢您对mathlab社区的帮助

阿尔贝托Baraldi

我一直在与网格数据作斗争,因为它在推断时存在问题…这真是太棒了!
感谢您对Matlab社区的巨大帮助。我们爱你

Chaowen梁

这正是我要找的……谢谢你! !节省了我很多时间来写一个…

Urs(我们)Schwarz

简单地说:如果你对nd-data调查/重建/插值/可视化很专业的话,它只是d'erriconian-draconian家族的另一个非常有用的成员,它平滑地将现在著名的兄弟姐妹(consolator, inpaint-nans)结合成一个非常好的工具箱,用于日常的数据欺骗努力……
代码非常干净,剖析器没有揭示不必要的热点…
然而,相比之下,帮助的部分只是令人难以置信的笨拙,几乎难以消化,没有严重的抗焦虑药物-约翰,约翰!这部分需要一些重大的检修和修饰……
总之,做得很好——谢谢你的这个片段
我们

迈克尔·罗宾斯

简洁的画面!

MATLAB版本兼容性
使用R2016a创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!

gridfitdir /演示/

gridfitdir /演示/ html /