使用 MATLAB,我想在数组中的每个点之间进行线性插值。
使用interpolate
将以非线性方式进行。我想做的类似于产生低通滤波器系数。
我想出了一个解决方案,但我想避免使用for
循环:
a=[0 0 1 0 0]; %Input matrix
N=5; %Number of points to be added
b=[];
for i=1:length(a)-1
b=[b linspace(a(i),a(i+1),N)];
end
没有循环可以做到这一点吗?
使用 MATLAB,我想在数组中的每个点之间进行线性插值。
使用interpolate
将以非线性方式进行。我想做的类似于产生低通滤波器系数。
我想出了一个解决方案,但我想避免使用for
循环:
a=[0 0 1 0 0]; %Input matrix
N=5; %Number of points to be added
b=[];
for i=1:length(a)-1
b=[b linspace(a(i),a(i+1),N)];
end
没有循环可以做到这一点吗?
您可以创建一个线性样条曲线,其中的点a
作为控制点。之后,您可以指定从开始间隔到结束间隔的任意数量的点。正如 Raab70 所说,您可以使用interp1
. interp1
可以通过以下方式调用(使用linear
插值):
out = interp1(x, y, xp, 'linear')
x
是x
值并且y
是y
控制点的值。 xp
是您要评估函数的点。因为您没有明确地有x
值并且您只想要这些y
值,所以您可以创建一个从 1 到输出数据L
中L
有多少点的虚拟向量。这个虚拟向量适用于您的x
值。之后,指定y
为您的输出数据。在这种情况下,它是数组a
. 接下来,您需要指定要沿曲线采样的位置。因为您想在每个空格之间引入 5 个点,所以总共将有 5*4 + 5 = 25 个点。每个“槽”5分,总共有4个槽。您还包括来自原始输出数据的 5 个点。要创建这 25 个点,只需执行linspace
从 1 到 5 的操作,并指定在此间隔之间需要 25 个点。这应该完美地捕获控制点( 的虚拟值1,2,3,4,5
)以及您要用于在每个控制点之间进行插值的值。
因此,尝试这样的事情:
N = 5; %// Number of points to introduce in between each control point
y = [0 0 1 0 0]; %// Your output data
L = numel(y); %// Size of output data. Cache so we don't have to keep typing in numel(y)
x = 1:L; %// Dummy vector
xp = linspace(1, L, N*(L-1) + N); %// Create points to interpolate. N*(L-1) + N is also just N*L
out = interp1(x, y, xp, 'linear'); %// Generate interpolated array
out
因此给了我:
out =
Columns 1 through 9
0 0 0 0 0 0 0 0.1667 0.3333
Columns 10 through 18
0.5000 0.6667 0.8333 1.0000 0.8333 0.6667 0.5000 0.3333 0.1667
Columns 19 through 25
0 0 0 0 0 0 0