这个例子展示了如何使用meshgrid
和ndgrid
。
在MATLAB®,网格数据意味着数据有序在一个网格。您可以通过思考MATLAB如何在矩阵中存储数据来理解有序数据。
定义一些数据。
A =画廊('uniformdata'[3 - 5],0)
A =3×50.9501 0.4860 0.4565 0.4447 0.9218 0.2311 0.8913 0.0185 0.6154 0.7382 0.6068 0.7621 0.8214 0.7919 0.1763
MATLAB将数据存储在矩阵中。你可以想到一个
作为一套由矩阵的指数下令元素的地方。线性指标一个
是:
矩阵中的任何元素都可以通过索引检索,也就是说,通过请求矩阵中该位置的元素。第i个元素一个
检索的A(ⅰ)
。
中检索第7个元素一个
。
(7)
ANS = 0.4565
对于一个m乘n矩阵,就可以找到列元素相邻的第i个元素由1抵消i为了找到行元素邻近所述第i个元素,偏移量i。由米。
检索列元件相邻(7)
。
A(6),A(8)
ANS = 0.7621
ANS = 0.0185
MATLAB使用类似的思想创建数据网格。网格不仅仅是一组满足特定几何属性的点。相反,一个网格数据集依赖于电网的点间的有序关系。在网格结构容易获得的邻接信息对于许多应用,特别是基于网格的插值非常有用的。
MATLAB提供了用于创建网格两种功能:
meshgrid
创建2-d和3-d网格是笛卡尔轴线对准。要创建一个2-d格,语法是[X,Y] = meshgrid(xgv,ygv)
哪里xgv
是长度的向量吗米
,ygv
是长度的向量吗ñ
。meshgrid
重复xgv
形成ñ
——- - - - - -米
矩阵X
,然后复制ygv
形成另一种ñ
——- - - - - -米
矩阵ÿ
。X
和ÿ
代表网格点的坐标。的行X
与水平线对齐X
轴和的列ÿ
与底片对齐吗ÿ
-轴。
ndgrid
创建的N- d网格是阵列空间对齐。在阵列空间的轴线的行,列,页等的调用语法是[X1,X2,X3,...,XN] = ndgrid(x1gv,x2gv,x3gv,...,xngv)
哪里x1gv、x2gv x3gv,…, xngv
是在每个维度中横跨网格的向量。X1, X2, X3,…, Xn
是可用于多变量函数求值和多维插值的输出数组。
使用meshgrid
要从两个向量创建一个二维轴对齐的网格,xgv
和ygv
。
xgv = [1 2 3];ygv = [1 2 3 4 5];[X,Y] = meshgrid(xgv,ygv)
X =5×31 2 3 1 2 3 1 2 3 1 2 3 1 2 3
Y =5×31 1 1 2 2 3 3 3 4 4 4 5 5 5
现在使用ndgrid
从相同的两个向量创建网格对齐的2 d的空间,xgv
和ygv
。
(X1, X2) = ndgrid (xgv ygv)
X1 =3×51 1 1 1 1 1 2 2 2 2 3 3 3 3 3 3
X2 =3×51 2 3 4 5 1 2 3 4 5
注意ndgrid
的X1
就是转置meshgrid
的X
。同样是真正的X2
和ÿ
。
对于给定的输入集合,则meshgrid
和ndgrid
函数将产生完全相同坐标的网格。它们的输出之间唯一的区别是坐标数组的格式。画出两个输出,看看它们是否相同。
图()[X1_ndgrid,X2_ndgrid] = ndgrid(1:3,1:5);Z =零(3,5);目(X1_ndgrid,X2_ndgrid,Z,'EdgeColor','黑色')轴等于;设置轴标签和标题H1 = GCA;h1.XTick = [1 2 3];h1.YTick = [1 2 3 4 5];包含(“ndgrid输出”)
图()[X_meshgrid,Y_meshgrid] = meshgrid(1:3, 1:5);网格(X_meshgrid, Y_meshgrid, Z ','EdgeColor','黑色')轴等于;设置轴标签和标题甘氨胆酸h2 =;h2。XTick = [1 2 3]; h2.YTick = [1 2 3 4 5]; xlabel(“meshgrid输出”)
根据您打算如何使用你的网格,你可能更喜欢一种格式或其他。MATLAB中的某些功能可能需要您的数据有meshgrid
格式,而其他人可能需要ndgrid
格式。
转换网格格式之间。转换二维网格输出meshgrid
到ndgrid
格式,转置坐标矩阵:
[X_meshgrid,Y_meshgrid] = meshgrid(1:3,1:5);[X1_ndgrid,X2_ndgrid] = ndgrid(1:3,1:5);ISEQUAL(X_meshgrid 'X1_ndgrid)ANS = 1 ISEQUAL(Y_meshgrid',X2_ndgrid)ANS = 1
交换
函数。ISEQUAL(置换(X_meshgrid,[2 1]),X1_ndgrid)ANS = 1
meshgrid
至ndgrid
,转置的坐标阵列的每个页面。对于给定的阵列my_array
,置换(my_array,[2 1 3])
行和列互换,最终效果是每个页面的位置互换:[X_meshgrid,Y_meshgrid,Z_meshgrid] = meshgrid(1:3, 1:5, [1 2]);[X1_ndgrid,X2_ndgrid,X3_ndgrid] = ndgrid(1:3,1:5, [1 2]);isequal(permute(Y_meshgrid,[2 1 3]),X1_ndgrid) ans = 1
网格向量。您传递到网格功能的输入被称为网格向量。电网矢量隐式地定义的网格。考虑两个向量,x1gv =(1:3)
和x2gv =(1:5)
。你可以把这些向量看作是X1
方向上和在一组坐标X2
方向,像这样:
每个箭头都指向一个位置。您可以使用这两个向量来定义一组网格点,其中一组坐标由x1gv
另一组坐标是x2gv
。当电网载体复制它们形成两个坐标数组组成满格:
单调和非单调网格。你输入的网格向量可能是单调要么非单调。单调向量包含维数增加或减少的值。相反,非单调向量包含波动的值。如果输入网格向量是非单调的,例如[2 4 6 8 3 1]
,ndgrid
输出以下内容:
(X1, X2) = ndgrid ([2 4 6 3 1]) X1 = 2 2 2 2 2 4 4 4 4 4 6 6 6 6 6 3 3 3 3 3 1 1 1 1 1 X2 = 2 4 6 3 1 2 4 6 3 1 2 4 6 3 1 2 4 6 3 1 2 4 6 3 1
均匀网格和非均匀网格。一个统一的网格是其中在给定尺寸的所有相邻点具有相等的间距。例如,[X1,X2] = ndgrid([1 3 5 9],[11 13 15])
是具有2个单位在每个维度的间距均匀。
在一个均匀网格中,间距不必在所有维度上都相等。例如,[X1,X2] = ndgrid([1 2 3 4],[11 13 15])
被认为是均匀的,即使间距X1
和X2
是不同的。
网格间距,其变化范围内的任何尺寸是非均匀网格。例如,[X1, X2] = ndgrid([1 5 6 9],[11 13 15])
创建一个非均匀网格,因为间距沿着第一维度而变化。
|
|
|
统一的 | 统一的 | 非均匀 |
MATLAB允许您用三种表示形式之一表示网格:全网格、紧凑网格或默认网格。紧凑网格和默认网格的使用主要是为了方便和提高效率。
满格。一个满格是其中点被明确地定义。的输出ndgrid
和meshgrid
定义一个完整的网格。
紧凑型格。网格中每个点的显式定义在内存方面是昂贵的。该紧凑的网格表示是一种避免满网格的内存开销的方法。紧凑的网格表示只存储网格向量,而不是整个网格。(以了解如何griddedInterpolant
类使用紧凑网格表示,请参阅使用griddedInterpolant类。)
默认网格。在许多情况下,在分析数据时,需要同时考虑网格中点之间的距离及其值。例如,数据集可能表示地理区域特定点的降雨量。在这种情况下,您将关心每个网格点的值以及点与其邻居之间的距离。在其他情况下,您可能只关心给定点的值,而不关心相对距离。例如,您可以处理来自MRI扫描的输入数据,其中点之间的距离是完全一致的。在这种情况下,您将关心这些点的值,但是您可以确定这是一个完全统一的网格。在这种情况下,默认网格表示是有用的。该默认的网格表示明确地存储在网格点的值,并暗中创建网格点的坐标。
在某些情况下,您可能需要为您的数据近似一个网格。通过选择合适的网格向量集,可以用标准MATLAB网格将近似网格理想化。例如,网格可以有沿着曲线的点。如果您的数据是基于经度和纬度的,可能会出现这样的数据集:
在这种情况下,虽然输入的数据不能直接网格化,可以近似在适当的间隔直网格线:
您也可以使用默认网格。
退化网格。一个简并网是网格的一种特殊情况,其中网格的一个或多个维度是单例的。单例维度可以是内部的,如in7:7
在这个例子:
(X1, X2, X3) = ndgrid (1:2:10、7:7 1:3:15);
(X1, X2, X3) = ndgrid (1:2:10、1:3:15 7:7);
如果使用索引来提取所需的数据,则生成的网格在X3
尺寸:
[X1,X2,X3] = ndgrid(1:3);X1_slice = X1(:,:,2)X1_slice = 1 1 1 2 2 2 3 3 3 X2_slice = X2(:,:,2)X2_slice = 1 2 3 1 2 3 1 2 3 X3_slice = X3(:,:,2)X3_slice = 2 2 2 2 2 2 2 2 2
数据网格化的概念是理解在MATLAB做的基于网格的插值的方式非常重要。
在基于网格的内插中,待内插的数据由有序栅格表示。例如,在矩形的平坦表面以1厘米的间隔的温度测量的布置从顶部至底部垂直和左到右的水平被认为是2-d栅格数据。基于网格的插值提供了一种有效的方式在网格点之间的任何位置来近似温度。
基于网格的插值可以极大地节省计算开销,因为网格结构允许MATLAB非常快速地定位一个查询点及其相邻的节点。为了理解这是如何工作的,考虑一下1-D网格上的以下点:
连接相邻的点线表示细胞的网格。第一个单元格出现在中间x = 1
和x = 3
,第二次发生在中间x = 3
和x = 5
, 等等。每个数字表示在网格的坐标。如果你要查询的网格在x = 6
,您必须使用插值,因为6在网格中没有明确定义。由于此网格的间距均为2,你可以用一个整数除法(6/2 = 3
)。这告诉你的一点是在网格的第三个细胞。在2 d网格定位单元包括一次在每个维度上执行此操作。这种操作称为快速查找,而MATLAB仅在数据排列成均匀网格时才使用这种技术。
这种快速查找可以有效地定位包含查询点的单元格XQ
。二进制搜索过程如下:
找到中心网格点。
相比XQ
到网格中心的那一点。
如果XQ
小于在中心找到的点,则从搜索中消除所有大于中心的网格点。类似地,如果XQ
比在中心发现了一个更大的,我们消除所有小于中心点的网格点的。请注意,这样做,我们已经降低了我们必须通过搜索一半的点数。
查找剩余网格点的中心,并从第2步重复,直到你留下你的查询一边一个网格点。这两个点关口边界包含单元格的XQ
。
为了说明二进制搜索的威力,考虑下面的示例。在电子信用卡授权出现之前,商家对抗欺诈性信用卡购买的唯一保护措施是将每位顾客信用卡上的账号与一份“坏”账号清单进行比较。这些名单是装订成册的小册子,上面有数以万计的卡号,按升序排列。为了一笔交易,在一份包含1万个账号的列表中搜索,需要进行多少次比较?对于任意的列表ñ
排序项,最大比较次数不超过可以将列表一分为二的次数log2 (n)
。因此,信用卡搜索将不会超过LOG2(10E3)
或者13个比较。如果考虑到执行顺序搜索需要进行多少比较,这就非常令人印象深刻了。
相比之下,考虑一个数据分散的问题。
X =兰特(20,1);Y =兰特(20,1);散射(X,Y)
为了找到接近查询点的点就需要更多的操作。如果您的数据可以近似为一个网格,基于网格的插值将提供计算和内存使用率大幅节省。
如果您的数据分散,可以使用中详述的工具插值散乱数据。
在MATLAB提供的插值方法创建插即传,虽然样本数据点的功能。如果你是一个样本位置查询插补功能,你会回来的样本数据点的值。相比之下,曲线和曲面拟合算法不一定穿过样品的数据点。
基于网格的插值提供了几种不同的插值方法。在选择插值方法时,请记住,有些方法比其他方法需要更多的内存或更长的计算时间。但是,您可能需要权衡这些资源,以获得所需的平滑结果。下表提供了每种方法的好处、权衡和需求的概述。
方法 | 描述 | 连续性 | 内存使用和性能 | 需求 |
---|---|---|---|---|
最近的邻居 | 查询点上的内插值为最近的样本网格点上的值。 | 间断 |
|
|
接下来邻居 | 查询点上的内插值就是下一个样本网格点上的值。 | 间断 | 同样的内存需求和计算时间为近邻。 |
|
以前的邻居 | 在查询点内插的值是在先前采样网格点的值。 | 间断 | 同样的内存需求和计算时间为近邻。 |
|
线性 | 在查询点内插的值在每个相应维度相邻网格点是基于所述值的线性内插。 | C0 |
|
|
Pchip | 在查询点的插补值在相邻的网格点是基于一个保形分段三次插值的值的。 | C1 |
|
|
立方体 | 在查询点内插的值在每个相应维度相邻网格点是基于三次插值的值的。 | C1 |
|
|
修改阿克玛 | 查询点上的内插值基于多项式的分段函数,次数最多为三次,使用每个相应维度上邻近网格点的值计算。Akima公式被修改以避免过冲。 | C1 |
|
|
仿样 | 在查询点内插的值在每个相应维度相邻网格点是基于三次插值的值的。 | C2 |
|
|
该图对不同的一维数据插值方法进行了一些直观的比较。
内插方法比较
MATLAB为基于网格的插值提供万博1manbetx了几种支持:
该插补
家庭的功能:interp1
,interp2
,interp3
,interpn
。
该griddedInterpolant
类。
这俩插补
函数族和griddedInterpolant
万博1manbetx支持N-D网格插值。但是,使用。有内存和性能优势griddedInterpolant
类在插补
功能。此外,griddedInterpolant
类提供了用于在任何数目的维度与网格数据的工作的单个一致的界面。
这个例子展示了如何interp1
函数可以用来插值一组样本值“pchip”
方法。
这个函数interp1
进行一维插值。它最一般的形式是:
Vq = interp1 (X, V, Xq,方法)
哪里X
是一个坐标向量V
是包含在这些坐标的值的向量。XQ
是含有在该内插的查询点的载体,以及方法
可选指定四种插值方法中的任何一种:“最近的”
,“线性”
,“pchip”
, 要么样条的
。
创建一组的1-d网格点X
和相应的样本值V
。
X = [1 2 3 4 5];V = [12 16 31 10 6];
内插在较细的间隔0.1的间隔。
Xq = (1:0.1:5);VQ = interp1(X,V,Xq的,“pchip”);
绘制样本和插值值。
情节(X, V,“o”);持有上图(Xq的,VQ,' - ');传奇(“样品”,“pchip”);持有从
这个示例展示如何使用'extrap'
选择插值超出你的采样点的域。
定义采样点和值。
X = [1 2 3 4 5];V = [12 16 31 10 6];
指定查询点,XQ
,延伸超过的域X
。
XQ =(0:0.1:6);VQ = interp1(X,V,Xq的,“pchip”,'extrap');
绘制的结果。
图绘制(X, V,“o”);持有上图(Xq的,VQ,' - ');传奇(“样品”,“pchip”);持有从
在替代的方法,可以引入额外的点获得对在区外推的行为更多的控制。例如,可以约束曲线通过用重复的值延伸的域在所推断区域保持平坦。
X = [0 1 2 3 4 5 6];V = [12 12 16 31 10 6 6];
指定查询点,XQ
的范围进一步扩展X
。
Xq = (1:0.1:7);
插入使用“pchip”
。可以省略'extrap'
选项,因为它是与“pchip”
,'makima'
,样条的
方法。
VQ = interp1(X,V,Xq的,“pchip”);
绘制的结果。
图绘制(X, V,“o”);持有上图(Xq的,VQ,' - ');传奇(“样品”,“pchip”);持有从
这个例子展示了如何interp2
函数可以用来对粗采样进行插值山峰
在更精细的网格功能。
该interp2
和interp3
功能分别执行两个和三维内插,并且它们在网格内插meshgrid
格式。对于调用语法interp2
具有一般形式:
VQ = interp2(X,Y,V,Xq的,YQ方法)
哪里X
和ÿ
定义网格的坐标数组在哪里meshgrid
格式,V
是包含网格点处值的数组。XQ
和Yq
是包含查询点处进行内插的坐标阵列。方法
可选指定四种插值方法中的任何一种:“最近的”
,“线性”
,“立方”
, 要么样条的
。
组成的网格点X
和ÿ
必须是单调递增的,并且应该符合meshgrid
格式。
创建一个粗网格和相应的样本值。
(X, Y) = meshgrid (3:1:3);V =山峰(X, Y);
画出样本值。
冲浪(X,Y,V)标题(“采样网格”);
为插值生成一个更细的网格。
[Xq的,Y染色体长臂] = meshgrid(-3:0.25:3);
使用interp2
在查询点进行插值。
VQ = interp2(X,Y,V,Xq的,YQ“线性”);
绘制的结果。
冲浪(Xq的,YQ VQ);标题(细化网格的);
这个例子说明如何使用interp3
在单个查询点内插三维函数,并将其与解析表达式生成的值进行比较。
interp3
工作在方法一样interp2
除了它需要另外两个参数:一个用于示例网格中的第三维度,另一个用于查询点中的第三维度,
VQ = interp3(X,Y,Z,V,Xq的,YQ ZQ,方法)
。
就像……一样interp2
,你提供给网格点interp3
必须是单调递增的,并且应该符合meshgrid
格式。
定义为X,Y和Z输入生成值的函数。
generatedvalues = @ (X (X, Y, Z)。Y ^ 2 +。^ 3 + z ^ 4);
创建示例数据。
[X,Y,Z] = meshgrid(( - 5:0.25:5));V = generatedvalues(X,Y,Z);
内插在特定的查询点。
Vq = interp3 (X, Y, Z, V, 2.35, 1.76, 0.23,“立方”)
VQ = 10.9765
相比VQ
到解析表达式所产生的值。
V_actual = generatedvalues(2.35,1.76,0.23)
V_actual = 10.9771
这个例子展示了如何interpn
功能可用于在使用更精细的网格来内插一个粗略采样函数“立方”
方法。
这个函数interpn
在网格上是在执行n维内插ndgrid
格式。它最一般的形式是:
Vq = interpn (X1, X2, X3……Xn, V, Y1, Y2, Y3,…, Yn,方法)
哪里X1, X2, X3,…, Xn
定义网格的坐标数组在哪里ndgrid
格式,V
是包含网格点处值的数组。Y1,Y2,Y3,...,YN
是包含查询点处进行内插的坐标阵列。方法
可选指定四种插值方法中的任何一种:“最近的”
,“线性”
,“立方”
, 要么样条的
。
组成的网格点X1, X2, X3,…Xn
必须是单调递增的,并且应该符合ndgrid
格式。
创建一组网格点和相应的样本值。
[X1,X2] = ndgrid(( - 5:1:5));R = SQRT(。X1 ^ 2 + X 2 ^ 2)+ EPS;V = SIN(R)./(R);
画出样本值。
目(X1,X2,V)标题(“采样网格”);
为插值创建一个更精细的网格。
[Y1,Y2] = ndgrid(( - 5:0.5:5));
内插在更精细的网格得出结果。
VQ = interpn(X1,X2,V,Y1,Y2,“立方”);目(Y1,Y2,VQ)标题(细化网格的);
interpn
有另一种语法:VQ = interpn(V,N次,方法)
这允许你插入一个比样本网格小几倍的整数网格。在前面的代码中,Y1
和Y2
询问在每个样本之间包含一个额外点的网格上的内插。下面的代码演示了如何使用ntimes = 1
。
利用内插在更精细的网格ntimes = 1
。
Vq = interpn (V, 1,“立方”);
绘制的结果。
网格(Vq)标题(“NTIMES的精细网格”);
请注意,该地块比前面的例子不同的比例尺度。这是因为我们叫啮合
只有通过了值。该啮合
函数中使用基于的尺寸的缺省网格VQ
。输出值是在两种情况下是相同的。
您还可以提供的查询点不均匀的网格。如果你是在网格中的一个区域,在一个更高的分辨率感兴趣的查询插值这可能是有用的。下面的代码演示了如何可以做到这一点。
内插在偏格。
(Y1, Y2) = ndgrid ([5 4 3 2 1 -1.5 -1.25 -0.75 -0.5 -0.20 -2.5 0]);VQ = interpn(X1,X2,V,Y1,Y2,“立方”);
绘制的结果。
网(Y1、Y2、Vq);标题(“偏移的电网”);
就像interpn
功能,griddedInterpolant
类提供了一个单一的接口,用于在基于网格的内插ñ维度。然而griddedInterpolant
提供以下额外好处:
它为对内插的重复查询提供了实质性的性能改进。
它提供了额外的性能提升和节省内存消耗,因为它存储了采样点为紧凑的网格。
griddedInterpolant
接受样本数据符合所述ndgrid
格式。如果你想创建一个griddedInterpolant
同meshgrid
,您将需要将数据转换为ndgrid
格式。看到转换meshgrid数据的ndgrid格式演示如何转换2-D和3-Dmeshgrids
。
该griddedInterpolant
类支持万博1manbetx插值方法也支持万博1manbetxinterpn
:最近的
,线性
,pchip
,立方体
,makima
,样条
。然而griddedInterpolant
以更少的开销提供更好的性能。
一个插值是一个执行插值的函数。通过调用。创建内插griddedInterpolant
构造函数,并传递示例数据:网格和相应的示例值。如果您希望覆盖默认的“线性”方法,也可以指定插值方法。调用语法有以下形式:
对于一维插值,你可以通过X
,点的集合,和v
中,包含对应的值的相同长度的向量。
F = griddedInterpolant(X,V)
对于更高的维度,你可以提供一个完整的网格。X1,X2,...,XN
的集合指定网格ññ- d数组。这些数组符合ndgrid
格式和大小与示例数组相同V
。
F = griddedInterpolant(X1,X2,...,XN,V)
如果你知道相邻采样点之间的距离是一致的,你可以griddedInterpolant
是,只透过采样点创建一个默认网格V
。
F = griddedInterpolant (V)
您也可以指定你的样本数据的坐标作为紧凑型格。紧凑的网格由一组向量来表示。然后将这些载体是通过在大括号它们打包成一个单元阵列;例如,{x1g,X2G,...,等板块涨幅居前}
在向量x1g x2g,…, xng
定义每个维度中的网格坐标。
F = griddedInterpolant ({x1g, x2g,…, xng}, V)
还可以用任何调用语法指定插值方法作为最后的输入参数。此示例指定最近邻插值。
F = griddedInterpolant ({x1g、x2g x3g}, V,“最近”)
该griddedInterpolant
,F
,以同样的方式被评估为你调用一个函数。您的查询点可以分散或网格化,并可以将它们传递给F
在以下任一方式:
你可以指定米——- - - - - -ñ矩阵XQ
,其中包含米散点ñ维度。该插补值VQ
返回作为米——- - - - - -1向量。
VQ = F(Xq的)
还可以将查询点指定为一系列ñ列向量x1q,x2q,...,xnq
的长度米。这些载体代表米点ñ维度。该插补值VQ
返回作为米——- - - - - -1向量。
Vq = F (xnq x1q, x2q,…)
可以将查询点指定为一系列ññ代表全网格维阵列。该阵列X1q,X2q,...,Xnq
所有的尺寸都是一样的吗ndgrid
格式。该插补值VQ
大小也是一样的。
Vq = F (Xnq X1q, X2q,…)
您也可以作为一个紧凑的网格指定查询点。x1gq x2gq,…, xngq
是在每个维度定义的网格点的向量。
Vq = F ({x1gq x2gq,…, xngq})
例如,在2-d:
Vq = F ({(0:0.2:10), (5:0.5:5)});
该griddedInterpolant
类接受ndgrid
格式化的示例数据。如果你想创建agriddedInterpolant
同meshgrid
数据时,你应该把它转换成ndgrid
格式。
下面的示例列出的步骤,用于将2-dmeshgrid
数据ndgrid
格式。首先创建meshgrid
和相应的样本值:
(X, Y) = meshgrid (2: .1:2, 1: .1:1);V = 0.75 * y ^ 3 - 3 * y 2 * x ^ 2;
转换X
,ÿ
,V
至ndgrid
格式,请遵循以下步骤:
转置网格中的每个数组以及样本数据。
X = X ';Y = Y ';V = V ';
现在创建插值。
F = griddedInterpolant(X,Y,V);
转换三维meshgrid
, 使用交换
函数。同样,从创建meshgrid
和相应的样本值:
[X, Y, Z] = meshgrid(5、三3 10:10);V = X。^ 3 + Y。^ 2 + Z;
转换X
,ÿ
,ž
,V
至ndgrid
格式,请遵循以下步骤:
使用交换
函数交换每个数组的行和列。最终效果将是每个页面的转置。
P = [1 2 3];X =置换(X,P);Y =置换(Y,P);Z =置换(Z,P);V =置换(V,P);
现在创建插值。
F = griddedInterpolant (X, Y, Z, V);
这个例子显示了如何创建和使用绘制1-d插值griddedInterpolant
用三次插值法。
创建一个粗网格和样本值。
X = [1 2 3 4 5];V = [12 6 15 9 6];
构建griddedInterpolant
使用三次插值法。
F = griddedInterpolant (X, V,“立方”)
F = griddedInterpolant与属性:GridVectors:{[1 2 3 4 5]}值:[12 6 15 9 6]的方法: '立方' ExtrapolationMethod: '立方'
该GridVectors
属性包含指定示例值坐标的紧凑网格V
。该方法
属性指定插值方法。注意,我们指定“立方”
当我们创建F
。如果省略方法
参数,默认的插值方法,线性
,将被分配到F
。
的任何属性F
以同样的方式访问字段结构体
。
F.GridVectors;%将网格向量显示为单元格数组F.Values;%显示的样本值F.Method;显示插值方法
内插在较细的间隔0.1的间隔。
Xq = (1:0.1:5);Vq = F (Xq);
绘制的结果。
情节(X, V,“o”);持有上图(Xq的,VQ,' - ');传奇(“样品”,三次插值的);
这个例子显示了如何创建和使用绘制2-d插值griddedInterpolant
。
在二维或更高维度中,您可以将示例坐标指定为anndgrid
、紧凑网格或默认网格。在本例中,我们将提供anndgrid
。
创建一个粗网格和样本值。
[X,Y] = ndgrid(-1:0.3:1,-2:0.3:2);V = 0.75 * Y. ^ 3 - 3 * Y - 2 * X。^ 2;
构建griddedInterpolant
。
V F = griddedInterpolant (X, Y,,样条的);
内插在较细的间隔0.1的间隔。
[Xq, Yq] = ndgrid (1: .1:1, 2: .1:2);VQ = F(Xq的,Y染色体长臂);
绘制的结果。
图()冲浪(X, Y, V);视图(65、60)标题(样本数据的);
图()冲浪(Xq的,YQ VQ);视图(65、60)标题(“雅致与样条”);
这个例子展示了如何创建一个3-D插值器并在一个切片平面上计算,这样您就可以在该平面上绘制值。
创建一个完整的网格和示例值。
[X,Y,Z] = ndgrid(( - 5:2:5));V = X. ^ 3 + Y ^ 2 + Z. ^ 2;
构建griddedInterpolant
。
F = griddedInterpolant(X,Y,Z,V,“立方”);
因为我们已经创建了完整的网格来生成示例值,所以在传递它时没有任何损失griddedInterpolant
。然而,在实践中,这是常见的样本数据从磁盘加载到MATLAB。紧凑的网格可以在这种情况下非常有利的,因为它允许您指定的形式,是在内存方面更经济的整个电网。如果我们装V
到MATLAB的,而不是从满格计算它,我们可以在工作区中创建一个紧凑的网格来节省内存。例如,
全球之声= {(5:2:5),(5:2:5),(5:2:5)};F = griddedInterpolant(全球之声,V,“立方”);
在平面上插值Z = 2
行距0.25倍。
[Xq, Yq Zq] = ndgrid ((5: .25:5) (5: .25:5), 2:2);Vq = F (Xq, Yq Zq);
绘制的结果。
冲浪(Xq的,YQ VQ);标题(“用线性插值改进”);
此示例创建一个4-d插值和在单个点计算它。
创建一个粗网格和样本值。
(X1, X2, X3, X4) = ndgrid ((5:2:5));V = X1。^ 3 + X2。^ 2 + X3。^ 2 + X4;
构建griddedInterpolant
。
F = griddedInterpolant (X1, X2, X3, X4, V,“线性”);
查询griddedInterpolant
在单点。
Vq = F([-3.2 2.1 4.7 -1.3])
MATLAB输出如下:
ANS = -10.1000
。
根据您的查询点的配置,你可能更喜欢在别人一个评估语法。例如,创建以下插值:
[X,Y] = ndgrid(-1:0.25:1,-2:0.25:2);V = 0.75 * Y. ^ 3-3 * Y-2 * X. ^ 2;F = griddedInterpolant(X,Y,V);
查询F
使用一个完整的网格来给出网格点的值:
[Xq的,Y染色体长臂] = ndgrid(-1:0.1:0,-2:0.1:0);VQ = F(Xq的,Y染色体长臂);
你也可以插入相同的网格使用紧凑的网格格式:
gvq = {1: .1:0, 2: .1:0};Vq = F (gvq);
或者您可以查询单个点:
Vq = F (.315 .738)
返回:
VQ = -2.1308
或一组随机散点:
RNG( '缺省')VQ = F(兰特(3,2))
返回:
Vq = -3.4919 -3.3557 -0.3515
您还可以检查值
在F
:
F.Values(1,3)
返回:
ans = -0.0313
或者你可以替换值
数组:
F。Values = 2*V;
您可以编辑属性F
在即时。例如,你可以按照以下步骤更换的插值方法:
F。方法=“立方”;
你也可以更换GridVectors
在F
。首先,检查GridVectors
:
全球之声= F.GridVectors;全球之声{1}
全球之声
是一个单元阵列,并全球之声{1}
显示第一个网格矢量:ANS = -1.0000 -0.7500 -0.5000 -0.2500 0 0.2500 0.5000 0.7500 1.0000
现在取代GridVectors
在F
通过创建一个新单元阵列new_gv
:
new_gv = {(0:0.3:1),(0:0.3:1)};F.GridVectors = new_gv;