griddata
或者TriScatteredInterp
类(注意:从R2013a开始,scatteredInterpolant
是推荐的替代品)。这两种方法都允许你将一组非均匀间距的点拟合到一个定期间隔的数据表面上(尽管看起来griddata
在较新的MATLAB版本中不再推荐使用)。以下是如何使用它们的方法:
griddata
:
[XI,YI,ZI] = griddata(x,y,z,XI,YI)
x,y,z
分别代表每个点(在此情况下是等高线上的点)的笛卡尔坐标向量。行向量XI
和列向量YI
是griddata
插值拟合曲面的值ZI
所插值的笛卡尔坐标。返回的矩阵XI,YI
的新值与将XI,YI
传递给meshgrid
创建均匀点网格的结果相同。
TriScatteredInterp
类:
[XI,YI] = meshgrid(...);
F = TriScatteredInterp(x(:),y(:),z(:));
ZI = F(XI,YI);
这里的 x,y,z
表示每个点的笛卡尔坐标向量,但这次我使用了一个 冒号重塑操作 (:)
确保它们成为 列向量 (TriScatteredInterp
所需的格式)。然后,您必须使用 meshgrid
创建矩阵 XI,YI
并使用它们评估插值器 F
。
下面是一些示例代码及其生成的图形,用于使用上述两种方法从轮廓数据重建表面。轮廓数据是使用 contour
函数生成的:
% First plot:
subplot(2,2,1);
[X,Y,Z] = peaks; % Create a surface
surf(X,Y,Z);
axis([-3 3 -3 3 -8 9]);
title('Original');
% Second plot:
subplot(2,2,2);
[C,h] = contour(X,Y,Z); % Create the contours
title('Contour map');
% Format the coordinate data for the contours:
Xc = [];
Yc = [];
Zc = [];
index = 1;
while index < size(C,2)
Xc = [Xc C(1,(index+1):(index+C(2,index)))];
Yc = [Yc C(2,(index+1):(index+C(2,index)))];
Zc = [Zc C(1,index).*ones(1,C(2,index))];
index = index+1+C(2,index);
end
% Third plot:
subplot(2,2,3);
[XI,YI] = meshgrid(linspace(-3,3,21)); % Generate a uniform grid
ZI = griddata(Xc,Yc,Zc,XI,YI); % Interpolate surface
surf(XI,YI,ZI);
axis([-3 3 -3 3 -8 9]);
title('GRIDDATA reconstruction');
% Fourth plot:
subplot(2,2,4);
F = TriScatteredInterp(Xc(:),Yc(:),Zc(:)); % Generate interpolant
ZIF = F(XI,YI); % Evaluate interpolant
surf(XI,YI,ZIF);
axis([-3 3 -3 3 -8 9]);
title('TriScatteredInterp reconstruction');
请注意,这两个结果之间几乎没有太大的差异(至少在这个尺度下)。另外要注意,在插值曲面的角附近由于轮廓数据稀疏而留有空区域。