如何在MATLAB中对二维数组执行插值

6

如何编写一个二元函数,输入为2D数组,输出为内插值?

我有一个大小为N x M的数组A。我需要对其进行内插,并获得该函数曲面以便在非整数参数上取值。(我需要将内插作为一个二元函数使用)

例如:

A[N,M] //my array
// here is the method I'm looking for. Returns function interpolatedA
interpolatedA(3.14,344.1) //That function returns interpolated value

搜索三次样条插值的帮助,或者使用spline()命令。 - John Alexiou
4个回答

6

这里有一个使用scatteredInterpolant的示例:

%# get some 2D matrix, and plot as surface
A = peaks(15);
subplot(121), surf(A)

%# create interpolant
[X,Y] = meshgrid(1:size(A,2), 1:size(A,1));
F = scatteredInterpolant(X(:), Y(:), A(:), 'linear');

%# interpolate over a finer grid
[U,V] = meshgrid(linspace(1,size(A,2),50), linspace(1,size(A,1),50));
subplot(122), surf(U,V, F(U,V))

图片

请注意,您可以在任何点处评估插值对象:

>> F(3.14,3.41)
ans =
     0.036288

上面的例子使用向量化调用,在网格的所有点上进行插值。

4

对于规则网格数据,请使用interp2。如果您的数据是离散的,请使用griddata。您可以创建一个匿名函数来作为这些调用的简化封装。

M = 10;
N = 5;
A = rand(M,N);
interpolatedA = @(y,x) interp2(1:N,1:M,A,x,y);
%interpolatedA = @(y,x) griddata(1:N,1:M,A,x,y); % alternative
interpolatedA(3.3,8.2)

ans =
      0.53955

谢谢,但我认为那不是我需要的。 就我所看到的,使用那些函数,我只能创建另一个具有表面值的数组。 但我需要将一个数组插值作为函数使用。(我已编辑问题) - MaxPY
@Max,你可以使用这些函数来插值任意数量的点。你可以得到你想要的特定[x,y]位置的一个值。 - shoelzer
谢谢!那很容易,我应该自己猜的。 我还是个新手,抱歉 :) - MaxPY
只是提醒:x和y值对应的是,而不是反过来。所以interpolated(3.3,8.2)返回的值在A(8,3)区域内。 - geometrikal
@geometrikal 谢谢!我更新了匿名函数,使输入的顺序为(y,x),就像数组索引一样。 - shoelzer

0
使用以下方式调用 spline() 命令:
% A contains N rows and 2 columns
pp = spline(A(:,1), A(:,2));
ppval(pp,3.44)

ans =

    0.4454

0

你看过interp2函数吗?

来自MatLab文档:

ZI = interp2(X,Y,Z,XI,YI)返回矩阵ZI,其中元素对应于XIYI的元素,并由在由矩阵XYZ指定的二维函数内插而确定。 XY必须是单调的,并且具有与meshgrid生成的格式相同(“平面”)。矩阵XY指定给定数据Z的点。超出范围的值返回为NaN


谢谢,但我认为那不是我需要的。 就我所看到的,使用那些函数,我只能创建另一个具有表面值的数组。 但我需要将一个数组插值作为一个函数来使用。(我已经编辑了问题) - MaxPY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接